2013-11-05 92 views
0

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

在另一侧我需要给我使用以下代码作为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转换是根据十进制值进行的。

能否请你帮我,让我可以在煤焦接收输出为00911234567890

问候 卡兰

+3

您有溢出问题。一个'unsigned int'(最可能)是32位,即四个字节。你无法在32位变量中安装910亿个。 –

回答

3

看起来你只是溢满你的unsigned int类型,这是你的系统上大概32位。更改:

 unsigned int convert =0; 

到:

 uint64_t convert = 0; 

,以保证64位数量为convert

请务必添加:

#include <stdint.h> 
1

铸造焦炭为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; 
} 
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 
+0

非常感谢您的回答。是的,这是一个无符号整数溢出的问题 - dint意识到这一点。再次感谢。 –

+0

@ user2955288当我尝试接受的答案(将您的帖子从'unsigned int'改为'uint64_t')时,我收到了'18446743384944119346'。嗯? – chux

相关问题