使用 memcpy 将结构转换为 char 数组
Posted
技术标签:
【中文标题】使用 memcpy 将结构转换为 char 数组【英文标题】:Converting a struct to char array using memcpy 【发布时间】:2015-10-20 06:18:25 【问题描述】:我正在尝试将以下结构转换为 char 数组,以便我可以通过串行端口发送它。
struct foo
uint16_t voltage;
char ID ;
char TempByte;
char RTCday[2];
char RTCmonth[2];
char RTCyear[2];
char RTChour[2];
char RTCmin[2];
char Sepbyte;
dvar = 500, 'X' , '>' , "18" , "10" , "15" , "20" , "15" , '#';
然后我使用以下命令将其转换为 char 数组:
char b[sizeof(struct foo)];
memcpy(b, &dvar, sizeof(struct foo));
但是由于某种原因,我在 char 数组中得到了这些尾随值
0x0A 0xFF
我最初认为它正在获取值,因为当我将其转换为 char 数组时,它实际上是将其转换为字符串,所以我认为它是 NULL '\0'
任何帮助将不胜感激。
谢谢
【问题讨论】:
我看不到结构datadownload
的位置以及它的大小
“尾随值”是什么意思?你如何检查数组的内容?你是在编程 C 还是 C++?语义可能不同。在不相关的说明中,您是否考虑过使用联合?
***.com/questions/119123/…
如果你把它转换成char
数组,没有人会为你添加一个NULL终止符。你需要自己做。
您的memcpy
在示例中是无用的,转换发生在将&dvar
作为void *
类型的参数传递时。这也可以:char *b = &dvar;
或更好的char *b = (char *)&dvar;
【参考方案1】:
在现代处理器上,sizeof(struct data download) 需要在 32 位边界上对齐。您的数据结构大小为 8 个字符 + 1 个短(16 位)整数。编译器需要在结构的大小上添加 2 个字符,以便在分配时能够正确处理它。 由于您正在通过串行线路进行通信并且确切地知道要发送的内容,因此您最好指定您愿意通过串行线路发送的确切字节数:2 +/*1 短 */ + 8 (8 个字节)。
【讨论】:
【参考方案2】:我偷偷怀疑您使用的是 8 位微控制器!
您可以通过打印b[sizeof(foo)]
和b[sizeof(foo)+1]
进行调试
这将是你的两个角色。
如果你注意到了,你不应该引用这些,它们超出了你的 char 数组的范围。例如 n 元素数组 [0..(n-1)] (从您的结构复制)
如果您将未使用的元素添加到您的结构(或增加最终成员的大小),则 char 数组可以终止 '\0' - 编译器可能想要这样做。
或者像@Melebius 展示的那样做一个指针赋值。
【讨论】:
以上是关于使用 memcpy 将结构转换为 char 数组的主要内容,如果未能解决你的问题,请参考以下文章