将BCD转换为unsigned char

时间:2013-11-05 07:44:12

标签: c

我有一个包含以下值的unsigned char数组:“\ 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的输出

此致 卡兰

3 个答案:

答案 0 :(得分:3)

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

     unsigned int convert =0;

为:

     uint64_t convert = 0;

为了保证convert的64位数量。

确保添加:

#include <stdint.h>

答案 1 :(得分: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;
}

答案 2 :(得分: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