C memcpy 以小字节序复制字节

Posted

技术标签:

【中文标题】C memcpy 以小字节序复制字节【英文标题】:C memcpy copies bytes with little endianness 【发布时间】:2018-02-05 09:18:00 【问题描述】:

我正在编写一个例程来将字节附加到一个字节数组中

unsigned long speed = 0xfeb;
char byteArray[8];
bzero(byteArray,8); //fills every of the 8 bytes with zero
memcpy(byteArray,&speed ,4); //copies 4 bytes from speed to byteArray

在操作之后,我希望 byteArray 的值是 0xfeb,但事实证明 byteArray 的值是 0xebf

发生了什么? memcpy 将结果强制为 little-endianness 是否正常?在不改变字节顺序的情况下我应该怎么做才能得到结果?

【问题讨论】:

没有规范。字节序取决于您的平台。 另外,byteArray 应该有 0xeb, 0x0f 输出将采用系统的字节顺序。如果你想控制这个,位交换到你想要的形式。 __builtin_bswap32() 和其他所有编译器都可用。 memcpy 会盲目地将数据从源复制到目标,数据在源和目标中如何排列以及如何处理取决于您的平台。 为什么你认为字节序正在改变? 【参考方案1】:

memcpy 只复制字节,不关心字节顺序:

将count个字节从src指向的对象复制到dest指向的对象。两个对象都被重新解释为无符号字符数组。

如果您使用的是 little-endian 机器,它会先复制 LSB。在大端机器上,它会先复制 MSB,然后你会得到预期的0x0f 0xeb


不相关,但不应使用硬编码值,而应使用sizeof,例如

unsigned long speed = 0xfeb;
char byteArray[sizeof(speed)];
bzero(byteArray, sizeof(byteArray));
memcpy(byteArray, &speed , sizeof(speed));

【讨论】:

代码 cmets 需要更新或删除。 fills every of the 8 bytes with zerocopies 4 bytes from speed to byteArray 不一致。【参考方案2】:

memcpy 完全按照它在锡上所说的那样:它复制内存。它不会弄乱字节的顺序。

仅当您想知道特定位模式如何映射到整数类型的值时,才与字节顺序相关。人们倾向于将各种事情归咎于字节顺序:在大多数情况下,它具有良性影响,这里就是这种情况。

【讨论】:

以上是关于C memcpy 以小字节序复制字节的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ 网络编程字节序的问题

memcpy与大小端

网络字节序的转换函数

c 样式字符串的字节序问题

C++socket编程,数据转为网络字节序的问题htons

字节序的理解----C语言和Python语言