0

我有一个包含以下值的无符号字符数组: "\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 的输出

问候卡兰

4

3 回答 3

3

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

     unsigned int convert =0;

到:

     uint64_t convert = 0;

为了保证 64 位的数量convert

确保添加:

#include <stdint.h>
于 2013-11-05T07:48:39.923 回答
1

将 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;
}
于 2013-11-05T08:45:30.883 回答
0

更改返回类型以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
于 2013-11-05T16:52:35.117 回答