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