我想为我在参数中输入的二进制文件获取此十六进制表示法:
我获得的输出以及我想要的东西
这是我编写的代码,我没有好的十六进制数字(对于5A之后的部分),我做错了什么?如何将我读取的字节正确转换为十六进制? 谢谢。
int main(int argc, char *argv[])
{
std::string parameter = "The\\Path\\To\My\exe.exe";
ifstream::pos_type size;
char * memblock;
ifstream file(parametre, 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;
string str = string(memblock, size);
string hexContent = "";
int maxColumn = 0;
std::stringstream ss;
int column = 0;
for (int i = 0; i < size; ++i)
{
ss << std::hex << (int)str[i];
if (column == 8)
{
ss << '\n';
column = 0;
}
column++;
}
std::string mystr = ss.str();
cout << mystr;
}
return 0;
}
答案 0 :(得分:1)
看起来char
已在您的系统上签名,并且您是符号扩展名的受害者。例如0x90是负数,因此当将其转换为int
时,必须进行负运算,结果为0xffffff90。
将文件读取到unsigned char
中,或者从uint8_t
中读取<cstdint>
,而不是char
的数组。
char * memblock;
成为
uint8_t * memblock;
然后
memblock = new char[size];
成为
memblock = new uint8_t[size];
并且以后不要将其转换为string
。
string str = string(memblock, size);
是毫无意义的,您可以很容易地从memblock
中读取内容,并撤消我们之前建立的无符号性。只需读出memblock
别忘了
delete[] memblock;
完成后。导致
使用std::vector
。它会自行清理。
std::vector<uint8_t> memblock(size);
file.seekg(0, ios::beg);
file.read(reinterpret_cast<char*>(memblock.data()), size);
//or file.read(reinterpret_cast<char*>(&memblock[0]), size); if no or data method