【问题标题】:Endian-ness in a char array containing binary characters包含二进制字符的 char 数组中的字节序
【发布时间】:2011-10-05 10:22:32
【问题描述】:

我正在构建一些代码来读取 RIFF wav 文件,但遇到了一些奇怪的事情。

文件头的前4个字节是big-endian ascii编码中的RIFF字:

   0x5249 0x4646

我使用以下方法阅读了第一个元素:

char *fileID = new char[4];
filestream.read(fileID,4);

当我将其写入屏幕时,结果符合预期:

std::cout << fileID << std::endl;
>>  RIFF

现在,接下来的 4 个字节给出了文件的大小,但至关重要的是它们是 little-endian。

所以,我写了一个基于联合的小函数来翻转字节:

int flip4bytes(char* input){

   union flip {int flip_int; char flip_char[4];};

   flip.flip_char[0] = input[3];
   flip.flip_char[1] = input[2];
   flip.flip_char[2] = input[1];
   flip.flip_char[3] = input[0];

   return flip.flip_int;

 }

这对我来说看起来不错,除了当我调用它时,返回的值完全错误。有趣的是,以下代码(其中字节不反转!)正常工作:

int flip4bytes(char* input){

   union flip {int flip_int; char flip_char[4];};

   flip.flip_char[0] = input[0];
   flip.flip_char[1] = input[1];
   flip.flip_char[2] = input[2];
   flip.flip_char[3] = input[3];

   return flip.flip_int;

 }

这让我彻底困惑。工会是否以某种方式为我颠倒了字节?!如果不是,如何正确地将字节转换为 int 而不会被反转?

我认为这里有一些我不知道的字节序的方面..

【问题讨论】:

  • 一个字符数组没有有字节序的概念。它只是一个字节数组,一个接一个。字节序仅适用于大于一个字节的类型,例如int。另外,你的意思是char flip_char[4] 在你的工会里吗?
  • 我做了,经过编辑以反映这一点。谢谢

标签: c++ endianness


【解决方案1】:

你只是在一个小端机器上,而“RIFF”字符串只是一个字符串,因此既不是小端也不是大端,而只是一个字符序列。在 little-endian 机器上不需要反转字节,但在 big-endian 上操作时需要。

【讨论】:

    【解决方案2】:

    您需要了解您机器的字节序。 #include &lt;sys/param.h&gt; 将帮助您做到这一点。

    您还可以使用网络字节顺序大结束的事实(如果我的记忆正确 - 您需要检查)。在这种情况下,转换为大端并使用ntohs 函数。这应该适用于您编译代码的任何机器。

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 2014-05-24
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多