filestream将十六进制文件读入二进制缓冲区

时间:2014-09-26 12:27:54

标签: c++ iostream

我有一个包含十六进制文本的文件,我想用二进制缓冲区读取它,使用std :: fstream

示例文件:

hex.txt

00010203040506070809

读取此信息会导致读取0到9之间的数字。

但是下面的代码没有按照我的意愿行事。

using std::ifstream;    
int main(int argc, char *argv[])
{
        ifstream hexfile("hex.txt");
        unsigned char c;
        while (hexfile >> std::hex >> std::setw(2) >> c) {
                printf ("got %u\n",c); //print as binary, not as char
        }    
        hexfile.close();
        return 0;
}

输出:

got 48
got 48
got 48
got 49
got 48
got 50
got 48
got 51
got 48
got 52
got 48
got 53
got 48
got 54
got 48
got 55
got 48
got 56
got 48
got 57

有趣的是,替换unsigned char c; with unsigned int c; 导致没有打印任何内容(即使在第一次读取时,文件流也可能返回false)

我做错了什么? std :: hex应该确保,该输入被解释为十六进制 std :: setw(2)应该确保每次迭代都读取2个字符

1 个答案:

答案 0 :(得分:1)

std::setw不会影响单个char的阅读,因此您一次只能阅读一个。

您逐个读取数字作为字符 您将它们打印为无符号整数(%u不表示二进制,它表示无符号十进制),它为您提供ASCII值(48 - 57)。

要从每个数字中获取相应的整数,请从中减去'0'

printf ("got %u\n", c - '0');

如果要将文件解释为双字符十六进制序列,请先将两个字符读入字符串,然后使用std::istringstreamstd::hex提取数字。

int main(int argc, char *argv[])
{
   std::ifstream hexfile("hex.txt");
   std::string x;
   while (hexfile >> std::setw(2) >> x) {
      std::istringstream y(x);
      unsigned int i;
      y >> std::hex >> i;
      printf ("got %u\n", i);
   }    
}
相关问题