【问题标题】:Does endianness have an effect when copying bytes in memory?在内存中复制字节时字节序是否有影响?
【发布时间】:2010-09-03 09:05:20
【问题描述】:

我是否认为字节序仅在我们讨论如何存储值时相关,而在复制内存时不相关?

例如

如果我有一个值 0xf2fe0000 并将其存储在一个小端系统上 - 字节按00、00、fe 和f2 的顺序存储。但在大端系统上,字节被存储f2、fe、00 和00。

现在 - 如果我只是想将这 4 个字节复制到另外 4 个字节(在同一系统上),在一个小端系统上,我最终会得到另外 4 个字节,其中包含 00、00、@ 987654331@ 和 f2 按这个顺序?

或者在内存中复制这些字节时字节序有影响吗?

【问题讨论】:

    标签: c++ c memory


    【解决方案1】:

    字节序仅在两种情况下相关

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

    【讨论】:

      【解决方案2】:

      回答问题标题。

      假设 '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 以编程方式查找字节序的信息

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 哪个“存储到文件”是 - 的子集,因为您不知道读取所述文件的应用程序是在 little-endian Windows PC 还是 big-endian iPhone 上运行。跨度>
          • ... 或任何其他形式的二进制序列化。
          【解决方案5】:

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

          但是,当您在架构之间传输二进制数据时,您还必须担心其他事情,例如整数类型的大小、浮点数的格式以及其他令人头疼的问题。

          【讨论】:

          • 对,但是如果系统的字节序会影响值的存储方式,并且我关心存储值在内存中的字节顺序,那么在这种情况下,我需要关心字节序。
          • 也许我需要将标题更改为“复制内存时我应该关心字节序吗?” - 可能当前的标题具有误导性。
          • @BeeBand:我的回答也回答了这个问题:只要您不在具有不同字节序的架构之间进行复制...
          • 是的。抱歉,您的回答确实回答了这个问题,尽管是含蓄的:)。
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-04-26
              • 1970-01-01
              • 2018-02-10
              • 1970-01-01
              • 1970-01-01
              • 2019-09-24
              • 2016-02-29
              • 1970-01-01
              相关资源
              最近更新 更多