[英]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.