c语言32bit数大小端转换,c语言大小端转化

2023-05-16

在工作中遇到一个问题,数据是以大端模式存储的,而机器是小端模式,必须进行转换,否则使用时会出问题。

一、定义:

大端模式(Big

Endian):数据的高字节,保存在内存的低地址中;数据的低字节,保存在内存的高地址中。

小端模式(Little

Endian):数据的高字节,保存在内存的高地址中;数据的低字节,保存在内存的低地址中。

例如:

16位宽的数0x1234,在不同的模式下,存储方式为:

0x4000

0x4001

小端模式

0x34

0x12

大端模式

0x12

0x34

32位宽的数0x12345678,在不同的模式下,存储方式为:

0x4000

0x4001

0x4002

0x4003

小端模式

0x78

0x56

0x34

0x12

大端模式

0x12

0x34

0x56

0x78

二、判断大端模式和小端模式

使用联合,通过判断首个成员的值,确定是大端还是小端模式:

boolIsBigEndian(){

unionNUM{

inta;

charb;

}num;

num.a = 0x1234;

if( num.b == 0x12 ){

returntrue;

}

returnfalse;

}

三、大端模式和小端模式转换

对32位的数,即4个字节,大端转换成小端:

方法1:使用移位运算。

uint32_t reversebytes_uint32t(uint32_t value){

return(value & 0x000000FFU) <

(value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24;

}

上述代码中,将低8位(0~8位)左移24位,变成了高8位(24~32位),8~16位左移8位变成了(16~24位)。将原高8位和高16位右移,变成了新的低8位和低16位。

这种方法效率采用了移位运算,效率很高。而且该方法亦可用于小端模式转成大端模式。

有了32位的转换方法,对64位,即8个字节的转换同理。不过直接写移位运算未免麻烦,可以直接使用上述函数:

// 先将64位的低32位转成小端模式,再将64位的高32位转成小端模式

// 在将原来的低32位放置到高32位,原来的高32位放置到低32位

uint64_t reversebytes_uint64t(uint64_t value){

uint32_t high_uint64 = uint64_t(reversebytes_uint32t(uint32_t(value))); // 低32位转成小端

uint64_t low_uint64 = (uint64_t)reversebytes_uint32t(uint32_t(value >> 32)); // 高32位转成小端

return(high_uint64 <

}

方法2:对每个字节依次处理。

比如0x12345678,小端模式下可认为是12*(2^32) + 34*(2^16) + 56*(2^8) +

78*(2^0)。在大端模式下,排列顺序发生了变化。

uint32_t changeEndian_uint32t(uint32_t value){

char* ptr = (char*)(&value);

uint64_t base[4]; // 设置基

base[0] = 1;

for(inti = 1; i 

base[i] = base[i-1] * 256;

}

uint32_t res = 0;

for(inti = 0; i 

res += uint8_t(ptr[i]) * base[4-i-1];

}

returnres;

}

a4c26d1e5885305701be709a3d33442f.png

上述代码中,第一句将输入的uint32_t的变量强制转换成字符类型数组,以便一个字节一个字节的处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言32bit数大小端转换,c语言大小端转化 的相关文章

随机推荐