[英]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
. 如果int
与int32_t
不同,则会出现问题。
256*256*256
overflow on 16-bit systems. 16位系统上256*256*256
溢出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.