c - sprintf 将十六进制数组转换为十进制字符数组只读取第一个字节

标签 c arrays hex printf decimal

我有一个数组:

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/

相关文章:

c - 为什么填充必须是2的幂?

c++ - 为什么 int i=400*400/400 给出结果 72,数据类型是循环的?

C - 在大写字母和数字的输入字符串中添加空格,但有一些异常(exception)

java - 查找数组的模式: no output

javascript - 是否可以获取与另一个数组中的项目匹配的对象数组中的所有项目的列表?

c++ - 大小为 k 的数组(大小为 n)的子集数,最大和最小元素之差最多为 x

java - 如何更改预定义的十六进制颜色的 alpha?

java - 如何在 Java 中解析十六进制的负长整型

c - 将标准输出和标准错误重定向到系统日志

c - 十六进制浮点常量