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

Reading little endian file 8 bits at a time and performing binary operations on it

我想从小端格式的文件中一次读取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 位读入一个 char 数组,然后将其转换为一个数字,我该怎么做?由于我正在测试代码的机器是小端,我认为我不需要进行字节交换但是如果其他人在大端机器上测试这段代码怎么办,我如何在运行时找到机器是小端还是大端?

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

我使用的代码是正确的,另一种方法可以是

char inBuf [3];
intputfile.read(inBuf, 3);
cfa[i][cnt] = ((uint8_t)inBuf[0]) << 4 | ((uint8_t)inBuf[1] & 0xF0) >> 4;
cfa[i][cnt+1] = ((uint8_t)inBuf[1] & 0x0F) << 8 | ((uint8_t)inBuf[2]);

如果您在 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 匹配 "network" 字节顺序,但在位域的情况下,在 little endian 平台上第一个定义的字段是最不重要的,而在 big endian 上 - 最重要的。从技术上讲,这不是标准定义的,但这个顺序是 Linux 和其他操作系统的内核代码 "canonized"。

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

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