簡體   English   中英

將32位十六進制加載到char數組中

[英]Loading 32-bit hexadecimal into char array

我正在嘗試將32位十六進制加載到char數組中。

#define NUC 0xA8051701

unsigned char debug_msg[100];
sprintf (debug_msg, "%08x", NUC);

但是它僅將“ A805”作為ASCII字符而不是十六進制加載。 誰能建議可能是問題所在。

我實際上正在尋找的是:

debug_msg[0]=0xA8
debug_msg[1]=0x05
debug_msg[2]=0x17
debug_msg[3]=0x01

而不是正確的值,它正在加載如下:

debug_msg[0]=0x30
debug_msg[1]=0x30
debug_msg[2]=0x30
debug_msg[3]=0x30
debug_msg[4]=0x61
debug_msg[5]=0x38
debug_msg[6]=0x30
debug_msg[7]=0x35

實際上,它正在以ASCII格式加載0x0000a805。

表面上,您需要:

 debug_msg[0] = (NUC >> 24) & 0xFF;
 debug_msg[1] = (NUC >> 16) & 0xFF;
 debug_msg[2] = (NUC >>  8) & 0xFF;
 debug_msg[3] = (NUC >>  0) & 0xFF;

(其中>> 0是可選的,但使它看起來更整潔-如果編譯器進行了優化以忽略該偏移)。 如果要代替NUC處理不同的值,則:

unsigned long value = 0xA8051701;

debug_msg[0] = (value >> 24) & 0xFF;
debug_msg[1] = (value >> 16) & 0xFF;
debug_msg[2] = (value >>  8) & 0xFF;
debug_msg[3] = (value >>  0) & 0xFF;

或采用宏形式:

#define MANGLE(value, debug_msg) \
    debug_msg[0] = (value >> 24) & 0xFF; \
    debug_msg[1] = (value >> 16) & 0xFF; \
    debug_msg[2] = (value >>  8) & 0xFF; \
    debug_msg[3] = (value >>  0) & 0xFF

用作:

MANGLE(0xA8051701, debug_msg)

或者,如果您希望值在數組中的任意偏移處:

#define MANGLE(value, debug_msg, offset) \
    debug_msg[offset+0] = (value >> 24) & 0xFF; \
    debug_msg[offset+1] = (value >> 16) & 0xFF; \
    debug_msg[offset+2] = (value >>  8) & 0xFF; \
    debug_msg[offset+3] = (value >>  0) & 0xFF

用作:

MANGLE(0xA8051701, debug_msg, 24);

可能需要將宏的主體包裝在do { … } while (0)循環中,以使其在if語句后可以正常工作,等等。

或者,您可以編寫一個內聯函數來完成這項工作。 要么 …

您可以在這里使用聯盟

#define NUMBER_OF_BYTES_FOR_UINT    4
Union Char_UInt
{
  U8 u8data[NUMBER_OF_BYTES_FOR_UINT];
  U32 u32data;
};

現在,您可以將“ NUC”(或任何32位數字)分配給“ u32data”,然后讀取“ u8data”,這將為您提供逐字節的值。

這是因為聯合為字符數組和u32data分配了相同的內存。 您通過相同的存儲器位置但通過不同的接口進行讀寫。

注意,系統的字節序在這里起作用。

暫無
暫無

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

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