gpt4 book ai didi

c++ - 一次读取 8 位小端文件并对其执行二进制操作

转载 作者:行者123 更新时间:2023-11-30 04:49:31 24 4
gpt4 key购买 nike

我想从小端格式的文件中一次读取 8 位,我想我的 cpu 也是小端格式,所以我不需要担心字节序,对吧?

我正在读取的是来自 RAW12 文件的 RGGB CFA 的数字、强度值。

这是我的代码 -

  uint8_t first8bits, second8bits, third8bits;
file.read((char*)&first8bits, sizeof(uint8_t));
file.read((char*)&second8bits, sizeof(uint8_t));
file.read((char*)&third8bits, sizeof(uint8_t));
Red_channel = (first8bits) << 4 | (second8bits & 0xF0) >> 4;
Green_channel = (second8bits & 0x0F) | (third8bits);

我看到其他人将它以 8 位读入一个字符数组,然后将其转换为一个数字,我该怎么做?由于我正在测试代码的机器是小端,我认为我不需要进行字节交换但是如果其他人在大端机器上测试这段代码怎么办,我如何在运行时找到机器是小端还是大端?

如有任何帮助,我将不胜感激。

最佳答案

如果你在 posix 平台上,你可能有 <endian.h>

与那些函数一起 http://man7.org/linux/man-pages/man3/htole32.3.html提供宏定义:__LITTLE_ENDIAN , __BIG_ENDIAN , __BYTE_ORDER (可能包含在 glib/types.h 或 bits/types.h 中)

所以你可以使用预处理器

#if __BYTE_ORDER == __LITTLE_ENDIAN

定义模板或类型,如果需要,这些模板或类型会导致一个或另一个操作。 Endiannes 意味着您必须注意:a) 字节顺序 b) 结构中位字段的顺序。 Big endian 匹配字节的“网络”顺序,但对于位字段,在 little endian 平台上第一个定义的字段是最不重要的,而在 big endian 上是最重要的。从技术上讲,这不是由标准定义的,但此顺序已被 Linux 和其他操作系统的内核代码“规范化”。

如果您使用的是 Windows,那么您使用的是小端平台。在 ARM 和 MIPS 上,事情要复杂得多,因为 CPU 实际上可以在一定程度上切换其字节顺序。这就是那些库函数确实存在的原因。

位移位操作允许忽略顺序,如果您记住位移位操作会自动将其操作数提升为 int,则可以使用它。 .

关于c++ - 一次读取 8 位小端文件并对其执行二进制操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55369412/

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