gpt4 book ai didi

c++ - 为什么 memcpy/memmove 在将 int 复制到字节缓冲区时反转数据?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:03 25 4
gpt4 key购买 nike

所以,我的问题很简单:

我需要用一些信息填充一个 char/unsigned char 数组。中间的一些值取自 short/int 类型,这就是发生的情况:

代码:

int foo = 15; //0x0000000F
unsigned char buffer[100]={0};

..
memcpy(&buffer[offset], &foo, sizeof(int)); //either memmove
...

输出:

... 0F 00 00 00 ..

所以现在我写了一个函数来反转这些字段,但我认为这不是一个明智的解决方案,因为它会影响执行时间、资源和开发时间。

有更简单的方法吗?

编辑:正如你们中的许多人所指出的,这种行为是由小端处理器产生的,但我的问题仍然存在。我需要用 big-endian 的 int/short 值填充这个缓冲区,因为我需要序列化要传输到以 little/big endian 工作的机器的数据,这并不重要,因为这个协议(protocol)已经定义好了。

注意:对于C++编译

最佳答案

因为你使用的处理器架构是little endian .多字节数字(任何大于 uint8_t 的数字)都以最低有效字节存储在最低地址。

编辑

您如何处理它实际上取决于缓冲区的用途。如果您只打算在内部使用缓冲区,请忘记字节交换,您将不得不在两个方向上进行,这会浪费时间。

如果它是针对某些外部实体的,例如文件或网络协议(protocol),文件或网络协议(protocol)的规范将说明字节序是什么。例如,所有 Internet 协议(protocol)的网络字节顺序实际上都是大端。网络库提供了一系列函数来转换用于发送和接收 Internet 协议(protocol)消息的值。例如 Selenium

https://linux.die.net/man/3/htonl

如果您想自己滚动,可移植的方法是使用移位,例如

void writeUInt32ToBufferBigEndian(uint32_t number, uint8_t* buffer)
{
buffer[0] = (uint8_t) ((number >> 24) & 0xff);
buffer[1] = (uint8_t) ((number >> 16) & 0xff);
buffer[2] = (uint8_t) ((number >> 8) & 0xff);
buffer[3] = (uint8_t) ((number >> 0) & 0xff);
}

关于c++ - 为什么 memcpy/memmove 在将 int 复制到字节缓冲区时反转数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42812150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com