把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. 需要注意的一点是,他们读取和写入的方法都是(某种意义上)相反的,不要搞错。