C++读取二进制文件并将其转换为十六进制
我在读取二进制文件并将其字节转换为十六进制表示时遇到了一些问题。C++读取二进制文件并将其转换为十六进制
我试过到目前为止:
ifstream::pos_type size;
char * memblock;
ifstream file (toread, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
cout << "the complete file content is in memory" << endl;
std::string tohexed = ToHex(memblock, true);
std::cout << tohexed << std::endl;
}
转换为十六进制:
string ToHex(const string& s, bool upper_case)
{
ostringstream ret;
for (string::size_type i = 0; i < s.length(); ++i)
ret << std::hex << std::setfill('0') << std::setw(2) << (upper_case ? std::uppercase : std::nouppercase) << (int)s[i];
return ret.str();
}
结果:53514C69746520666F726D61742033
。
当我打开用十六进制编辑的原始文件,这是它表明:
53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00
04 00 01 01 00 40 20 20 00 00 05 A3 00 00 00 47
00 00 00 2E 00 00 00 3B 00 00 00 04 00 00 00 01
00 00 00 00 00 00 00 00 00 00 00 01 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 00 00 00 00 05 A3
00 2D E2 1E 0D 03 FC 00 06 01 80 00 03 6C 03 D3
有没有办法用C来获得相同的期望输出++?
工作液(罗布):
...
std::string tohexed = ToHex(std::string(memblock, size), true);
...
string ToHex(const string& s, bool upper_case)
{
ostringstream ret;
for (string::size_type i = 0; i < s.length(); ++i)
{
int z = s[i]&0xff;
ret << std::hex << std::setfill('0') << std::setw(2) << (upper_case ? std::uppercase : std::nouppercase) << z;
}
return ret.str();
}
char *memblock;
…
std::string tohexed = ToHex(memblock, true);
…
string ToHex(const string& s, bool upper_case)
有你的问题,就在那里。构造函数std::string::string(const char*)
将其输入解释为一个以nul结尾的字符串。因此,只有导致'\0'
的字符甚至会传递到ToHex
。请尝试以下其中一种方法:
std::string tohexed = ToHex(std::string(memblock, memblock+size), true);
std::string tohexed = ToHex(std::string(memblock, size), true);
好的...这对十六进制转换工作...但我仍然有一个问题:结果不完全相同。 '47'现在是'00',或'2D'现在是'05'..所有非ASCII字符都是如此。 – technology 2012-03-08 17:38:59
@develroot - 如果有帮助,你的'ToHex'例程中有一个符号扩展错误。尝试'(s [i]&0xff)'而不是'(int)s [i]'。 – 2012-03-08 17:53:19
“memblock只包含前15个字节,停在空字节(第16个)”是什么让你说的?我看不出你在哪里打印出'memblock'的内容。我怀疑'memblock'包含整个文件,但是你没有向我们展示的代码误解了它的内容。请将您的程序减少到显示错误的最小完整程序,并在问题中发布该程序。 http://sscce.org – 2012-03-08 17:20:07
@Rob好的,我应该转发前15个字节,让你更清楚吗? – technology 2012-03-08 17:21:46
假设这是一项家庭作业或某种学习任务,这里有几点提示:(1)缺少一个“while”循环,(2)在刚打开的流上调用tellg()为时尚早。 – dasblinkenlight 2012-03-08 17:22:22