我在将结构数据复制到byteArray
时遇到问题。该字节数组用于通过接口传递信息。对于普通数据类型,我必须使用byteswap
。
但现在我有一个结构。当我使用memcpy
时,交换结构的值。
如何轻松地复制结构和正确复制#34;到字节数组?
memcpy(byteArray, &stData, sizeof(stData));
stData
有一个简单的整数。 0x0001
将作为0x1000
存储在字节数组中。
答案 0 :(得分:2)
如果您使用的是x86架构机器,那么整数将以“Little Endian”顺序存储,并且首先使用最低有效字节。这就是0x0001在字节数组中显示为0x01 0x00的原因。只要您在具有相同体系结构的计算机上解压缩,这将正常工作,但这是二元序列化非常重要的(很多)原因之一。
如果您需要以安全的方式在机器之间交换二进制数据,那么您可以决定标准(例如将所有二进制数据转换为little-endian或big-endian;网络线协议通常转换为big-endian,虽然许多高性能专有系统从今天开始就坚持使用little-endian,这是大多数机器上的原生格式),或者寻找便携式二进制文件格式,例如HDF或BSON。 (这些存储关于存储的二进制数据的元数据。)最后,您可以转换为ASCII(XML,json)。 (另外,请注意“大”和“小”不是唯一的选择 - “每台机器”都是一个很高的订单,因为它们还没有被发明。:))
有很多例子,请参阅wikipedia或在SO上搜索“endian”。
答案 1 :(得分:1)
你的问题是你在Little Endian结束时想要将它存储为Big endian。
在标准C库中,您可以执行此操作 htons,htonl:host(你的小端机器)到网络标准(big endian)。
为16位,l为32位(http://linux.die.net/man/3/htons)
对于4字节整数,您可以执行
#include <arpa/inet.h>
#include <stdint.h>
...
*(uint32_t*)byteArray = htonl((uint32_t)stData);
对于8字节int,您可以使用bswap_64 https://www.gnu.org/software/gnulib/manual/html_node/bswap_005f64.html
但它只存在于gnu libc上。否则你必须手动交换,网上有很多例子。