将32位十六进制加载到char数组

时间:2017-03-24 05:28:59

标签: c

我正在尝试将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。

2 个答案:

答案 0 :(得分:3)

从表面上看,你需要:

 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语句之后正常工作等。

或者你可以写一个内联函数来完成这项工作。或者......

答案 1 :(得分:0)

您可以在这里使用联盟

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

现在,您可以分配" NUC" (或任何32位数字)到" u32data"然后阅读" u8data",它将为您提供逐字节值。

这是因为union为字符数组和u32data分配了相同的内存。您可以通过不同的接口从相同的内存位置进行写入和读取。

请注意,系统的Endianness在此处起作用。