C - 如何将 int 转换为 uint8_t?

Jac*_*kie 3 c integer endianness

我有这个结构:

struct block{
    uint8_t *tBlock;
}
Run Code Online (Sandbox Code Playgroud)

这个结构体将有 1024 个字节,所以tBlock = malloc(1024).

我有一个整数,我想用 4 个字节写入 tBlock[0] 到 tBlock[3] 小端。我有这个 :

uint8_t little[4];

void inttolitend(uint32_t x, uint8_t* lit_int){
   lit_int[3] = (uint8_t)x / (256*256*256);
   lit_int[2] = (uint8_t)(x % (256*256*256)) / (256*256);
   lit_int[1] = (uint8_t)((x % (256*256*256)) % (256*256)) / 256;
   lit_int[0] = (uint8_t)((x % (256*256*256)) % (256*256)) % 256;
}
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

int x = 7;
inttolitend(x, little);
Run Code Online (Sandbox Code Playgroud)

我得到 little[0] = 7、little[1] = 0、little[2] = 0 和 little[3] = 0,所以我的转换器完全失败了。我怎么能在 4 个字节的 uint8_t 中得到 7?

Nay*_*uki 5

这是执行此操作的标准方法 - 简洁明了:

void inttolitend(uint32_t x, uint8_t *lit_int) {
    lit_int[0] = (uint8_t)(x >>  0);
    lit_int[1] = (uint8_t)(x >>  8);
    lit_int[2] = (uint8_t)(x >> 16);
    lit_int[3] = (uint8_t)(x >> 24);
}
Run Code Online (Sandbox Code Playgroud)

或使用类似于您的问题的算术:

void inttolitend(uint32_t x, uint8_t *lit_int) {
    lit_int[0] = (uint8_t)(x % 256);
    lit_int[1] = (uint8_t)(x / 256 % 256);
    lit_int[2] = (uint8_t)(x / 256 / 256 % 256);
    lit_int[3] = (uint8_t)(x / 256 / 256 / 256 % 256);
}
Run Code Online (Sandbox Code Playgroud)

附录:

反向转换 - 惯用语:

uint32_t litendtoint(uint8_t *lit_int) {
    return (uint32_t)lit_int[0] <<  0
         | (uint32_t)lit_int[1] <<  8
         | (uint32_t)lit_int[2] << 16
         | (uint32_t)lit_int[3] << 24;
}
Run Code Online (Sandbox Code Playgroud)

或使用类似于您的问题的算术:

uint32_t litendtoint(uint8_t *lit_int) {
    return (uint32_t)lit_int[0]
         + (uint32_t)lit_int[1] * 256
         + (uint32_t)lit_int[2] * 256 * 256
         + (uint32_t)lit_int[3] * 256 * 256 * 256;
}
Run Code Online (Sandbox Code Playgroud)