读小端16位无符号整数

我正在研究parsingterminfo数据库文件,这是一种二进制文件。 你可以自己阅读它的存储格式 ,并确认我面临的问题。

手册说 –

标题部分开始文件。 本节包含以下格式的六个短整数。 这些整数是

(1)魔法数字(八进制0432);

短整数存储在两个8位字节中。 第一个字节包含值的最低有效8位,第二个字节包含最高有效8位。 (因此,表示的值是256 * second + first。)值-1由两个字节0377,0377表示; 其他负面的价值是非法的 。 这个值通常意味着这个terminal缺less相应的能力。 不符合硬件的机器必须将整数读取为两个字节并计算小端值


  • parsing这种types的input的第一个问题是它将大小固定为8位,所以普通的旧字符不能被使用,因为它不能保证大小正好是8位。 所以我在寻找' 固定宽度的整数types ',但又面临selectb / w int8_tuint8_t int8_t ,它明确指出 – “只有当实现直接支持types提供”。 那么,我应该select什么样的types是足够便携的。

  • 第二个问题是c ++标准库中没有buffer.readInt16LE()方法,它可能以Little Endian格式读取16个字节的数据。 那么我应该如何继续以便携和安全的方式来实现这个function。

我已经试过用char数据types读取它,但是它肯定会在我的机器上产生垃圾。 正确的input可以通过infocmp命令读取,例如 – $ infocmp xterm


 #include <fstream> #include <iostream> #include <vector> int main() { std::ifstream db( "/usr/share/terminfo/g/gnome", std::ios::binary | std::ios::ate); std::vector<unsigned char> buffer; if (db) { auto size = db.tellg(); buffer.resize(size); db.seekg(0, std::ios::beg); db.read(reinterpret_cast<char*>(&buffer.front()), size); } std::cout << "\n"; } 

 $1 = std::vector of length 3069, capacity 3069 = {26 '\032', 1 '\001', 21 '\025', 0 '\000', 38 '&', 0 '\000', 16 '\020', 0 '\000', 157 '\235', 1 '\001', 193 '\301', 4 '\004', 103 'g', 110 'n', 111 'o', 109 'm', 101 'e', 124 '|', 71 'G', 78 'N', 79 'O', 77 'M', 69 'E', 32 ' ', 84 'T', 101 'e', 114 'r', 109 'm', 105 'i', 110 'n', 97 'a', 108 'l', 0 '\000', 0 '\000', 1 '\001', 0 '\000', 0 '\000', 1 '\001', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 1 '\001', 1 '\001', 0 '\000', .... .... 

解析这种类型的输入的第一个问题是它将大小固定为8位,所以普通的旧字符不能被使用,因为它不能保证大小恰好是8位。

任何至少8位的整数都可以。 虽然char不能保证正好是8位,但至少需要8位,所以就大小而言,除了在某些情况下需要屏蔽高位。 然而, char可能不是无符号的,你不希望八位字节被解释为有符号值,所以使用unsigned char

第二个问题是c ++标准库中没有buffer.readInt16LE()方法,它可能以Little Endian格式读取16个字节的数据。 那么我应该如何继续以便携和安全的方式来实现这个功能。

一次读取一个八位组到一个unsigned char 。 将第一个字节分配给变量(这个变量足够大,可以表示至少16位)。 将第二个八位字节的位左移8,并使用复合按位或者分配给变量。

或者更好的是,不要重新实现它,而是使用第三方现有的库。

我已经试过用char数据类型读取它,但是它肯定会在我的机器上产生垃圾。

然后你的尝试是越野车。 char固有问题不会导致垃圾输出。 我建议使用调试器来解决这个问题。