C - 如何将 int 转换为 uint8_t?
C - How to convert an int to uint8_t?
我有这个结构:
struct block{
uint8_t *tBlock;
}
这个结构将有 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;
}
但是当我这样做时:
int x = 7;
inttolitend(x, little);
我得到了 little[0] = 7、little[1] = 0、little[2] = 0 和 little[3] = 0,所以我的转换器完全失败了。我怎样才能在 4 个字节的 uint8_t 中得到 7?
这是执行此操作的标准方法 - 简洁明了:
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);
}
或使用与您的问题类似的算法:
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);
}
附录:
反向转换——惯用语:
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;
}
或使用与您的问题类似的算法:
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
顺便说一下,这个 是 7 的 Little Endian。
OP 使用 lit_int[3] = (uint8_t)x / (256*256*256);
错误地在除法之前进行了 cast。
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;
}
如果 int
与 int32_t
不同,调用 int x = 7; inttolitend(x, little);
就会出现问题。
256*256*256
在 16 位系统上溢出。
我有这个结构:
struct block{
uint8_t *tBlock;
}
这个结构将有 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;
}
但是当我这样做时:
int x = 7;
inttolitend(x, little);
我得到了 little[0] = 7、little[1] = 0、little[2] = 0 和 little[3] = 0,所以我的转换器完全失败了。我怎样才能在 4 个字节的 uint8_t 中得到 7?
这是执行此操作的标准方法 - 简洁明了:
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);
}
或使用与您的问题类似的算法:
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);
}
附录:
反向转换——惯用语:
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;
}
或使用与您的问题类似的算法:
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
顺便说一下,这个 是 7 的 Little Endian。
OP 使用 lit_int[3] = (uint8_t)x / (256*256*256);
错误地在除法之前进行了 cast。
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;
}
如果 int
与 int32_t
不同,调用 int x = 7; inttolitend(x, little);
就会出现问题。
256*256*256
在 16 位系统上溢出。