在内存中复制字节时,字节顺序是否有效?

时间:2010-09-03 09:05:21

标签: c++ c memory

我认为,只有当我们讨论如何存储一个值并且在复制内存时不相关时,endianess才有意义吗?

例如

如果我有一个值0xf2fe0000并将其存储在一个小端系统上 - 字节将按0000fef2的顺序存储。但是在大端系统上,字节存储为f2fe0000

现在 - 如果我只是想将这4个字节复制到另外4个字节(在同一个系统上),在一个小端系统上我最终会得到另外4个字节,包含00,{{1 }},00fe 按此顺序

或者在内存中复制这些字节时,字节顺序是否有效?

7 个答案:

答案 0 :(得分:7)

字节顺序仅与两种情况相关

  1. 当手动检查多字节对象的字节转储时,您需要知道字节是以小端还是大端顺序排序,以便能够正确解释字节。
  2. 当程序与外界通信多字节值时,例如通过网络连接或文件。然后,双方需要就通信中使用的字节顺序达成一致,如果需要,还需要在内部和外部字节顺序之间进行转换。

答案 1 :(得分:4)

回答问题标题。

假设'int'为4个字节

union{
   unsigned int i;
   char a[4];
};

// elsewhere
i = 0x12345678;
cout << a[0];   // output depends on endianness. This is relevant during porting code
                // to different architectures

那么,它不是关于复制(单独)?这是关于你如何访问的?

通过网络传输原始字节时也很重要!

Here's以编程方式查找字节序的信息

答案 2 :(得分:3)

没有在同一台机器上工作时,只要在小端机器和大端机器之间传输二进制数据时,就不必担心字节顺序

答案 3 :(得分:3)

memcpy不知道它在复制什么。如果必须复制43 61 74 00,则不知道它是复制0x00746143还是0x43617400或浮动或"Cat"

答案 4 :(得分:2)

基本上,只有当您需要 在字节顺序不同的体系结构之间传输二进制数据 时,才必须担心字节序。

但是,当您在体系结构之间传输二进制数据时,您还必须担心其他事情,例如整数类型的大小,浮动数字的格式和其他讨厌的头痛。

答案 5 :(得分:0)

是的,您正确地认为在存储或传送当前“范围”之外的二进制值时,您应该知道字节序。 一般来说,只要一切都在你自己的程序中,你就不必担心。 如果您复制内存,请记住您要复制的内容。 (如果存储long值并阅读ints),则可能会遇到麻烦 请查看htonl(3)或有关网络编程的书籍,以获得一些很好的解释。

答案 6 :(得分:0)

Memcpy仅复制字节,并不关心字节序。 因此,如果您要将一个网络流复制到另一个网络流,请使用memcpy。