2011-12-02 134 views
3

您好我有例如3198基地10號和十六進制表示是0x0C7E轉換數字節數組

如何轉換這一數字爲十六進制,並將該十六進制值的字節數組中的格式[00] [0C] [7E],假設我能夠擁有的最大十六進制值是0xffffff。

+0

什麼C數據類型你說的「基地10號」是什麼意思? C有整數類型,它們不區分3198和0x0C7E。 –

回答

7

也許這會工作?

uint32_t x = 0x0C7E; 
uint8_t bytes[3]; 

bytes[0] = (x >> 0) & 0xFF; 
bytes[1] = (x >> 8) & 0xFF; 
bytes[2] = (x >> 16) & 0xFF; 


/* Go back. */ 
x = (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0] << 0); 
+0

啊不錯!謝謝對不起,我很喜歡C。但是,我如何將3198轉換爲十六進制? – edelweiss

+0

哦另一個問題,如果我想o恢復字節數組回到十六進制格式我該怎麼做? – edelweiss

+0

@edelweiss我編輯了我的答案。 – cnicutar

1

數已經連續內存塊 - 無需將其轉換爲尚未ANOTHER陣!只需使用指針運算獲取不同的字節:

編輯:編輯成字節順序無關

#define FAST_ABS(x) ((x^(x>>31)) - (x>>31)) 

int is_big_endian(void) 
{ 
    union { 
     uint32_t i; 
     char c[4]; 
    } bint = {0x01020304}; 

    return bint.c[0] == 1; 
}  

uint32_t num = 0xAABBCCDD; 
uint32_t N = is_big_endian() * 3; 

printf("first byte 0x%02X\n" 
     "second byte 0x%02X\n" 
     "third byte 0x%02X\n" 
     "fourth byte 0x%02X\n", 
     ((unsigned char *) &num)[FAST_ABS(3 - N)], 
     ((unsigned char *) &num)[FAST_ABS(2 - N)], 
     ((unsigned char *) &num)[FAST_ABS(1 - N)], 
     ((unsigned char *) &num)[FAST_ABS(0 - N)] 
     ); 
+0

字節順序依賴。如果你在SPARC或PPC系統上運行這個(big-endian),你會得到相反的結果。 –

+0

請參閱編輯。我把它改成了字節序不變的。 Endianess檢查想法取自[這裏](http://stackoverflow.com/questions/1001307/detecting-endianness-programmatically-in-ac-program) –

+0

一個複雜的解決方案,不存在的問題,如果你編程一個便攜的方式開始,重新cnicutar的答案。我給你一個精明的持久化+1 ;-) –

-1
#include <stdio.h> 

union uint32_value { 
    unsigned int value; 

    struct little_endian { 
     unsigned char fou; 
     unsigned char thi; 
     unsigned char sec; 
     unsigned char fir; 
    } le; 

    struct big_endian { 
     unsigned char fir; 
     unsigned char sec; 
     unsigned char thi; 
     unsigned char fou; 
    } be; 
}; 

int main(void) 
{ 
    union uint32_value foo; 
    foo.value = 3198; 
    printf("%02x %02x %02x %02x\n", foo.le.fir, foo.le.sec, foo.le.thi, foo.le.fou); 

    return 0; 
}