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

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

一、定义:

大端模式(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的变量强制转换成字符类型数组,以便一个字节一个字节的处理。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值