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

时间:2019-03-27 03:36:26

标签: c++ image-processing file-handling demosaicing raw-file

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

任何帮助我都会很感激。

2 个答案:

答案 0 :(得分: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)struct中位字段的顺序。大字节序匹配字节的“网络”顺序,但是在位字段的情况下,在小字节序平台上,最先定义的字段无效,而在大字节序上则是最高有效。从技术上讲,这不是标准定义的,但是此顺序由Linux和其他OS的内核代码“规范化”。

如果您使用的是Windows,则说明您使用的是Little Endian平台。在ARM和MIPS上,事情变得更为复杂,因为CPU实际上可以在一定程度上切换其字节序。这就是那些库函数确实存在的原因。

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

答案 1 :(得分: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]);