【问题标题】:conversion of BCD to unsigned char将 BCD 转换为无符号字符
【发布时间】:2013-11-16 00:45:36
【问题描述】:

我有一个包含以下值的无符号字符数组:"\x00\x91\x12\x34\x56\x78\x90"; 那是以十六进制格式发送的数字。 此外,它是 BCD 格式:00 字节,91 另一个字节(8 位)

另一方面,我需要将此值解码为 0091234567890。

我正在使用以下代码:

unsigned int conver_bcd(char *p,size_t length)
  {
         unsigned int convert =0;
         while (length--)
          {
             convert = convert * 100 + (*p >> 4) * 10 + (*p & 15);
             ++p
           }
       return convert;

}

但是,我得到的结果是 1430637214。

我的理解是,我发送的是十六进制值 (\x00\x91\x12\x34\x56\x78\x90),而我的 bcd 转换作用于十进制值。

您能帮我吗,以便我可以在 Char 中收到 00911234567890 的输出

问候 卡兰

【问题讨论】:

  • 您遇到了溢出问题。 unsigned int (很可能)是 32 位,即四个字节。您无法将 910 亿放入 32 位变量中。

标签: c


【解决方案1】:

看起来您只是在溢出您的 unsigned int,它在您的系统上大概是 32 位。变化:

     unsigned int convert =0;

到:

     uint64_t convert = 0;

为了保证convert的64位数量。

确保添加:

#include <stdint.h>

【讨论】:

    【解决方案2】:

    将 char 转换为 unsigned char,然后用 %02x 打印。

    #include <stdio.h>
    
    int main(void)
    {
        char array[] = "\x00\x91\x12\x34\x56\x78\x90";
        int size = sizeof(array) - 1;
        int i;
    
        for(i = 0; i < size; i++){
            printf("%02x", (unsigned char )array[i]);
        }   
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      将返回类型更改为unsigned long long 以确保您有足够大的整数。

      p 类型更改为无符号类型。

      打印带有前导零的值。

      unsigned long long conver_bcd(const char *p, size_t length) {
        const unsigned char *up = (const unsigned char*) p;
        unsigned long long convert =0;
        while (length--) {
          convert = convert * 100 + (*up >> 4) * 10 + (*up & 15);
          ++up;
          }
        return convert;
      }
      
      const char *p =  "\x00\x91\x12\x34\x56\x78\x90";
      size_t length = 7;
      printf( "%0*llu\n", (int) (length*2), conver_bcd(p, length));
      // 00911234567890
      

      【讨论】:

      • 非常感谢您的回答。是的,这是 unsigned int 溢出的问题 - 意识到这一点。再次感谢。
      • @user2955288 当我尝试您接受的答案时(将您的帖子从unsigned int 更改为uint64_t),我收到了18446743384944119346。嗯?
      猜你喜欢
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      相关资源
      最近更新 更多