1

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

任何帮助我都会非常感激。

4

2 回答 2

1

如果你在 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)结构中位字段的顺序。大端匹配字节的“网络”顺序,但在位字段的情况下,在小端平台上,第一个定义的字段是最不重要的,而在大端是最重要的。从技术上讲,这不是标准定义的,但这个顺序是由 Linux 和其他操作系统的内核代码“规范化”的。

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

位移位操作允许忽略顺序,如果您记住位移位操作会自动将其操作数提升为int.

于 2019-03-27T07:34:54.970 回答
0

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

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]);
于 2019-03-27T06:34:14.023 回答