我有一个包含以下值的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的输出
此致 卡兰
答案 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