如何反转endianness?求助理解C语言实现endianness反转的代码逻辑
大小端反转的核心逻辑
大小端本质是多字节数据在内存中的字节存储顺序不同,反转endianness就是把多字节数据的字节顺序完全倒转。比如4字节的int原内存字节序为字节0 字节1 字节2 字节3,反转后变为字节3 字节2 字节1 字节0。
代码逻辑拆解
你贴的完整实现代码如下:
int reverse_endianess(int value) { int resultat = 0; char *source, *destination; int i; source = (char *) &value; destination = ((char *) &resultat) + sizeof(int); for (i = 0; i < sizeof(int); i++) *(--destination) = *(source++); return resultat; }
这段代码的核心思路是把int类型的内存空间按字节逐个逆序拷贝,强转char*的原因是char指针的步长为1字节,移动时只会偏移1字节,刚好可以逐个操作int的每一个字节。
你不理解的代码片段逐行解释
destination = ((char *) &resultat) + sizeof(int); for (i = 0; i < sizeof(int); i++) *(--destination) = *(source++);
我们以32位系统、sizeof(int) = 4的常见场景举例,逻辑非常好理解:
source是指向输入参数value首字节的char指针,每次+1就往后走1字节,刚好按顺序取value的第0、1、2、3个字节((char *) &resultat)是存储结果的变量resultat的首字节(低地址),加sizeof(int)也就是加4之后,destination就指向了resultat内存空间最后一个字节的下一个地址,也就是超出resultat最高地址1字节的位置- 循环每次执行时先给
destination减1,刚好就落到resultat的第3、2、1、0个字节的位置 - 赋值操作就是把
value按正序取出来的字节,倒着填到resultat的内存空间里
举个实际数值示例:假设输入int为0x12345678,小端存储下value的内存按地址从低到高存储为0x78 0x56 0x34 0x12
- 第一次循环:
destination减1指向resultat最高地址,赋值0x78 - 第二次循环:
destination减1指向次高地址,赋值0x56 - 第三次循环:
destination减1指向次低地址,赋值0x34 - 第四次循环:
destination减1指向最低地址,赋值0x12
最终resultat的内存为0x12 0x34 0x56 0x78,读出来就是0x78563412,刚好完成大小端反转。
内容的提问来源于stack exchange,提问作者user16986383
相关产品推荐
相关产品推荐

