繁体   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