gpt4 book ai didi

c++ - 包含二进制字符的 char 数组中的字节顺序

转载 作者:太空宇宙 更新时间:2023-11-04 15:26:20 25 4
gpt4 key购买 nike

我正在构建一些代码来读取 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

因此,我编写了一个基于 union 的小函数来翻转字节:

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;

}

这让我很困惑。 union 是否以某种方式为我颠倒了字节?!如果不是,如何在不反转的情况下将字节正确转换为 int?

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

最佳答案

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

关于c++ - 包含二进制字符的 char 数组中的字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7659846/

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