[英]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);
我得到很少[0] = 7,小[1] = 0,小[2] = 0和小[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;
}
我得到的很少[0] = 7,很少[1] = 0,很少[2] = 0而且很少[3] = 0
順便說一句,這是 7歲的Little Endian。
OP使用lit_int[3] = (uint8_t)x / (256*256*256);
在分裂之前錯誤地做了演員。
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 x = 7; inttolitend(x, little);
int x = 7; inttolitend(x, little);
如果int
與int32_t
不同,則會出現問題。
16位系統上256*256*256
溢出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.