我想一次从文件中读取小尾数格式的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,我如何在运行时查找呢? ?
任何帮助我都会很感激。
答案 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]);