首页 > 解决方案 > 从文件读取后显示缓冲区中的十六进制代码

问题描述

我正在尝试将从文件中读取的十六进制代码存储到缓冲区中,然后将其显示在控制台上,到目前为止它似乎不起作用。这是我的代码:

using namespace std;

int main()
{
 ifstream file("Fishie.ch8",ios::binary);
 if (!file.is_open())
{
    cout << "Error";
}
else
{
    file.seekg(0, ios::end);
    streamoff size = file.tellg();
    file.seekg(0, ios::beg);
    char *buffer = new char[size];
    file.read(buffer, size);
    file.close();
    for (int i = 0; i < size; i++)
    {
        cout <<hex<< buffer[i] << " ";
    }
}
delete[] buffer;
cin.get();
}

预期的输出应该是这样的:

00 e0 a2 20 62 08 60 f8 70 08 61 10 40 20 12 0e
d1 08 f2 1e 71 08 41 30 12 08 12 10 00 00 00 00
00 00 00 00 00 18 3c 3c 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3e 3f 3f 3b 39 38 38 38 00 00 80 c1 e7 ff 7e 3c
00 1f ff f9 c0 80 03 03 00 80 e0 f0 78 38 1c 1c
38 38 39 3b 3f 3f 3e 3c 78 fc fe cf 87 03 01 00
00 00 00 00 80 e3 ff 7f 1c 38 38 70 f0 e0 c0 00
3c 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

相反,在上面的输出中,我得到了一些看起来很奇怪的符号,里面有很多空格。它看起来像这样: 二进制文件输出 可能是什么问题?

标签: c++binaryfiles

解决方案


当您缓冲时,char所有元素都将打印为字符。您想要的是转换为十六进制的数字。

顺便说一句:当您想要转换为十六进制输出时,如果您真的想char从文件或unsigned char.

如您所见,您必须在转换为之前和之后转换为喜欢的istream.read用途的签名:charunsigned charunsigned int

cout <<hex<< (unsigned int)(unsigned char) buffer[i] << " ";

对于真正的 c++ 用户,你应该写一个很好的static_cast;)

这将打印出十六进制值。但是如果你有一个CR你会看到一个'a'而不是'0a',所以你必须设置你的宽度并在之前填充字符:

cout.width(2);
cout.fill('0');

for (int i = 0; i < size; i++)
{   
    cout <<hex<< (unsigned int)(unsigned char)buffer[i] << " ";
}   

顺便说一句:delete[] buffer;在错误的范围内,必须在定义的范围内转移。


推荐阅读