Преобразовать двоичный файл в шестнадцатеричное обозначение - PullRequest
0 голосов
/ 26 сентября 2018

Я хотел бы получить эту шестнадцатеричную запись для двоичного файла, который я ввожу в параметр:

Вывод, который я получаю, и то, что я хочу:

enter image description here

Это код, который я написал, у меня нет хорошего шестнадцатеричного числа (для части после 5А), что я делаю неправильно?Как правильно преобразовать байт, который я прочитал, в гекс?Спасибо.

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 голосов
/ 26 сентября 2018

Похоже, char подписано в вашей системе, и вы стали жертвой расширения знака.Например, 0x90 является отрицательным, поэтому при преобразовании в int этот негатив должен быть перенесен, что приведет к 0xffffff90.

Solution

Считайте файл в 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 
...