我正在尝试将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。
答案 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在此处起作用。