在C中完成指针转换时,将交换字节

时间:2013-09-24 22:11:55

标签: c pointers casting

我有一个“无符号短路”数组,即C中每个元素16位。我有两个“无符号短路”值,它们应该以小端顺序写回数组,这意味着最低有效元素将首先出现。例如,如果我有以下值:

unsigned int val = 0x12345678;

它应该存储在我的数组中:

unsigned short buff[10];
buff[0] = 0x5678;
buff[1] = 0x1234;

我编写了一个代码来立即写入值,而不是提取int值的高16位和低位,并分别写入它们,因为可能存在原子性问题。我的代码如下所示:

typedef unsigned int UINT32;
*((UINT32*)(buff)) = (value & 0xffff0000)  + (value & 0xffff);

令人惊讶的是,上面的代码工作正常,结果将是:

buff[0] is 0x5678;
buff[1] is 0x1234;

问题是,如图所示,我正在以大端顺序保存“unsigned short”值而不是我想要的小端。换句话说,当我将指针从“unsigned short *”转换为“unsigned int *”时,16位元素会自动交换!有谁知道这里发生了什么以及数据交换的原因?

1 个答案:

答案 0 :(得分:1)

您的平台以小端格式表示数据,并通过将buff转换为(UINT32 *),您告诉编译器现在必须将buff解释为指向unsigned int的指针。指令

*((UINT32*)(buff)) = (value & 0xffff0000)  + (value & 0xffff);

只需将“写入(值& 0xffff0000)+(值& 0xffff)写入此无符号整数(buff)”。这就是他所做的,他如何存储它不是你的事。您不应该访问较低或较高的16位,因为它取决于平台,哪一个首先出现。

所有你知道的是,如果你将buff作为unsigned int访问,你将获得与之前存储在那里相同的值,但假设任何特定的字节顺序是不安全的。

所以基本上你的代码有不确定的行为。