我有一个数组:
unsigned char datalog[4];
datalog[0] = 0;
datalog[1] = 0xce;
datalog[2] = 0x50;
datalog[3] = 0xa3;
这些代表十六进制值 0xce50a3。它的十进制值为13521059。
我需要将这个十六进制值转换为十进制数组,最好使用 sprintf,这样最终结果将是:
finalarray[0] = '1';
finalarray[1] = '3';
finalarray[2] = '5';
finalarray[3] = '2';
finalarray[4] = '1';
finalarray[5] = '0';
finalarray[6] = '5';
finalarray[7] = '9';
我尝试了几种 sprintf 输入组合,包括将我的十六进制数组连接成无符号长数据记录值 = 0xce50a3。但是 sprintf 在转换时只读取它的第一个字节。
例如:
sprintf(finalarray, "%d", *(unsigned long *)datalog);
产量:
finalarray[0] = '2';
finalarray[1] = '0';
finalarray[2] = '6';
finalarray[3] = ' ';
.....
206是0xce的十进制表示。所以它只转换第一个十六进制字节而不是其余的。
关于如何将整个 unsigned long 转换为十进制数组有什么想法吗?
最佳答案
正如其他一些人所提到的,尝试按数字顺序读取数组的字节将取决于系统,因为 Big Endian 和 Little Endian 系统会给出不同的结果。
此外,通过指针欺骗进行类型双关是未定义的行为,因为它打破了严格的别名。将双关语类型化为 char-family 数组以外的类型的合法方法涉及使用 union 以多种方式表示数据。但是,由于上述 Endian 问题,您不应该针对此问题执行此操作,而应执行 R Sahu 的回答中提到的移位方法。
关于c - sprintf 将十六进制数组转换为十进制字符数组只读取第一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49564216/