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 zero
和 copies 4 bytes from speed to byteArray
不一致。【参考方案2】:
memcpy
完全按照它在锡上所说的那样:它复制内存。它不会弄乱字节的顺序。
仅当您想知道特定位模式如何映射到整数类型的值时,才与字节顺序相关。人们倾向于将各种事情归咎于字节顺序:在大多数情况下,它具有良性影响,这里就是这种情况。
【讨论】:
以上是关于C memcpy 以小字节序复制字节的主要内容,如果未能解决你的问题,请参考以下文章