把int
等数字转换成字节流,需要考虑字节的顺序,有大端序或小端序两种。这两种顺序很多平台、算法、协议里都有用到。
大端序
int
数字 0xAABBCCDD
按照大端序存储,顺序应该是0xAA
, 0xBB
, 0xCC
, 0xDD
。
C++ 代码如下:
void write_int(uint32_t x, uint8_t* buf){
for(int i=0;i<4;i++){
*buf++ = (x>>((3-i)*8))&0xff;
}
}
uint32_t read_int(uint8_t* buf){
uint32_t x = 0;
for(int i=0;i<4;i++){
x<<=8;
x |= (*buf++);
}
return x;
}
小端序
0xAABBCCDD
按照小端序存储,顺序应该是0xDD
, 0xCC
, 0xBB
, 0xAA
。
C++ 代码如下:
void write_int(uint32_t x, uint8_t* buf){
for(int i=0;i<4;i++){
*buf++ = x&0xff;
x >>= 8;
}
}
uint32_t read_int(uint8_t* buf){
uint32_t x = 0;
for(int i=0;i<4;i++){
x |= (*buf++)<<(i*8)
}
return x;
}
ps. 需要注意的一点是,他们读取和写入的方法都是(某种意义上)相反的,不要搞错。