簡體   English   中英

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

我得到很少[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); 如果intint32_t不同,則會出現問題。

16位系統上256*256*256溢出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM