将二进制文件转换为十六进制表示法

时间:2018-09-25 21:17:37

标签: c++ arrays hex std

我想为我在参数中输入的二进制文件获取此十六进制表示法:

我获得的输出以及我想要的东西

enter image description here

这是我编写的代码,我没有好的十六进制数字(对于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;
}

1 个答案:

答案 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