C++ memcpy 将结构体转换为字节数组

标签 c++ arrays struct byte memcpy

我在将结构体数据复制到我的 byteArray 时遇到问题。该字节数组用于通过接口(interface)传递信息。对于普通数据类型,我必须使用byteswap

但现在我有了一个结构。当我使用memcpy时,结构体的值会被交换。

如何轻松地将结构体“正确”地复制到字节数组?

memcpy(byteArray, &stData, sizeof(stData));

stData 有简单的整数。 0x0001 将作为 0x1000 存储在字节数组中。

最佳答案

如果您使用的是 x86 架构计算机,则整数将以“Little Endian”顺序存储,最低有效字节在前。这就是为什么 0x0001 在字节数组中会显示为 0x01 0x00。只要您也在具有相同架构的机器上解压,这就可以正常工作,但这是二进制序列化不平凡的(许多)原​​因之一。

如果您需要以安全的方式在机器之间交换二进制数据,那么您可以决定一个标准(例如,将所有二进制数据转换为小端或大端;网络线路协议(protocol)通常转换为大端,尽管许多高性能专有系统坚持使用小尾数法(因为今天这是大多数机器上的 native 格式),或者寻找可移植的二进制文件格式,例如 HDF 或 BSON。 (这些存储有关所存储的二进制数据的元数据。)最后,您可以转换为 ASCII(XML、json)。 (另外,请注意,“大”和“小”并不是唯一的选择 - “每台机器”都是一个艰巨的任务,因为它们还没有全部发明出来。:))

参见wikipedia或者在 SO 上搜索“endian”以获取许多示例。

关于C++ memcpy 将结构体转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562189/

相关文章:

c++ - Direct3D11:在设备之间共享纹理:黑色纹理

c++ - 是否可以将项目直接从 Visual Studio 导出到它自己的文件夹中?

c++ - boost::asio::strand::dispatch(handle) 还是直接调用句柄?

go - 使用 Go 范围语法的意外行为

c++ - 在另一个构造函数中调用对象数组的构造函数

c++ - Qt:无法对 MyClass 类型的参数进行排队

c++ - 反向数组 - 没有第一个数字

javascript - 如何从 2 个数组中仅返回不重复的对象

javascript - 如何在 HTML 列表中显示此 JS 数组?

c - 直接从 C 中的函数调用访问结构元素