使用 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 数组的主要内容,如果未能解决你的问题,请参考以下文章

单片机C语言怎样把double型转换为char型数据

如何将char数组转换为CString

C++,如何将char型数组转换为string类型数组。

如何将char类型数组转换为unicode字符串

将双精度转换为字符数组 C++

模拟实现函数 memcpy