简体   繁体   English

C - 如何将int转换为uint8_t?

[英]C - How to convert an int to uint8_t?

I have this struct: 我有这个结构:

struct block{
    uint8_t *tBlock;
}

This struct will have 1024 bytes so tBlock = malloc(1024) . 此结构将具有1024个字节,因此tBlock = malloc(1024)

I have an integer that I want to write in 4 bytes so tBlock[0] to tBlock[3] in little endian. 我有一个整数,我想用4个字节写,所以tBlock [0]到tBlock [3]的小端。 I have this : 我有这个 :

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;
}

But when I do: 但当我这样做时:

int x = 7;
inttolitend(x, little);

I got little[0] = 7, little[1] = 0, little[2] = 0 and little[3] = 0 so I totally fail my converter. 我得到很少[0] = 7,小[1] = 0,小[2] = 0和小[3] = 0所以我完全失败了我的转换器。 How could I get 7 in uint8_t in 4 bytes? 我如何在4个字节中获得uint8_t中的7?

Here is the standard way to do it - nice and concise: 这是标准的方法 - 简洁明了:

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);
}

Or using arithmetic similar to your question: 或者使用类似于您的问题的算术:

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);
}

Addendum: 附录:

The reverse conversion - idiomatic: 反向转换 - 惯用语:

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;
}

Or using arithmetic similar to your question: 或者使用类似于您的问题的算术:

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;
}
void inttolitend(uint32_t x, uint8_t* lit_int){

    lit_int[0] = x & 0xff;
    lit_int[1] = (x>> 8) & 0xff;
    lit_int[2] = (x>> 16) & 0xff;
    lit_int[3] = (x>> 24) & 0xff;
}

I got little[0] = 7, little[1] = 0, little[2] = 0 and little[3] = 0 我得到的很少[0] = 7,很少[1] = 0,很少[2] = 0而且很少[3] = 0

Btw, this is Little Endian for 7. 顺便说一句,这 7岁的Little Endian。

OP uses of lit_int[3] = (uint8_t)x / (256*256*256); OP使用lit_int[3] = (uint8_t)x / (256*256*256); mistakenly did the cast before the division. 在分裂之前错误地做了演员。

void inttolitend(uint32_t x, uint8_t* lit_int){
   lit_int[3] = (uint8_t) (x / 16777216);
   lit_int[2] = (uint8_t) (x / 65536);
   lit_int[1] = (uint8_t) (x / 256);
   lit_int[0] = (uint8_t) x;
}

Calling int x = 7; inttolitend(x, little); 调用int x = 7; inttolitend(x, little); int x = 7; inttolitend(x, little); is a problem if int is not the same as int32_t . 如果intint32_t不同,则会出现问题。

256*256*256 overflow on 16-bit systems. 16位系统上256*256*256溢出。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM