конвертировать необработанные байты в шестнадцатеричный код в С++ или ассемблере (FASM)

Я знаю, что это звучит как очень глупый вопрос, но я пытаюсь создать простой шестнадцатеричный редактор и не могу прочитать байты из файла. Я использую readfile api для чтения буфера размером 8 КБ, а затем я собирался преобразовать 8 КБ в шестнадцатеричный, но иногда это дает мне только 4 байта в обратном порядке, а иногда и 0. Я не уверен, что делаю неправильно. как я могу получить его туда, где он даст мне полные 8 КБ в шестнадцатеричном представлении. Если это лучший способ преобразовать весь файл в шестнадцатеричный, сообщите мне. Я просто ищу самый быстрый способ прочитать весь файл и отобразить его на экране в шестнадцатеричном представлении. спасибо

Синтаксис FASM, но вполне может быть и C++

invoke ReadFile, [hFile],filebuffer,8192, BytesWritten, 0 
cinvoke wsprintfA,buffer1,"%X",[filebuffer]
invoke MessageBoxA,NULL,buffer1,title,MB_ICONINFORMATION+MB_OK 

все данные дд?

Обновление Я пометил второй ответ как ответ, потому что нашел сборку синтаксиса masm, которая выглядела так, и это было очень быстро, но я пошел дальше и выбрал CryptBinaryToString api http://msdn.microsoft.com/en-us/library/windows/desktop/aa379887

вот ассемблерный код синтаксиса fasm, но опять же легко может стать c++

invoke ReadFile, [hFile],filebuffer,500, BytesWritten, 0
        push    dwBuffLen
        push    pszHexBuffer
        push    0x0000000b  ; CRYPT_STRING_HEXASCIIADDR
        push    500
        push    filebuffer
        call    [CryptBinaryToStringA]
;pszHexBuffer contains the data

data sections
filebuffer rb 500
BUF_LEN       = 4000
        pszHexBuffer  db BUF_LEN   dup(0)  ; will contain converted bytes in hex. Twice the size of the original buffer at least (Read documentation about the last _In_Out parameter)
        dwBuffLen     dd BUF_LEN

person Darrin Woolit    schedule 24.05.2014    source источник
comment
Это не похоже ни на один C++, который я видел. Он отдаленно напоминает так называемую резьбовую макросборку от PDP-11 конца 1970-х годов.   -  person wallyk    schedule 25.05.2014
comment
Я знаю, что это сборка, но с таким же успехом это может быть С++, потому что это просто вызовы API.   -  person Darrin Woolit    schedule 25.05.2014
comment
@DarrinWoolit Вы можете отказаться от идеологии printf и сбросить кусочки с помощью таблицы поиска. Это, вероятно, было бы ближе к тому, что вы хотите в любом случае. Для этого потребуется таблица из 16 символов (символы с '0' по 'F') и итеративный дамп, разбивающий каждый октет на два 4-битных полубайта, а затем используя каждый полубайт в качестве индекса в таблице, чтобы узнать, какой символ выгружать. Во всяком случае, так я поступал в прошлом. Не нужно использовать кувалду, как printf, чтобы прихлопнуть муху (хотя это, очевидно, проще реализовать). Обратите внимание, что предполагается, что 8-битный тип char работает правильно.   -  person WhozCraig    schedule 25.05.2014


Ответы (2)


Что-то в стиле «сделай сам», но это должно сработать.

inline char nibble_decode(char nibble)
{
    const char byte_map[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    return byte_map[nibble];
}

char *hex_string(char *buffer, unsigned char *bytes, int length)
{
    for(int i = 0; i < length; i++){
        buffer[i*3] = nibble_decode(bytes[i] >> 4);
        buffer[i*3+1] = nibble_decode(bytes[i] & 0x0f);
        buffer[i*3+2] = ' ';
    }
    buffer[length*3] = '\0';
    return buffer;
}

Напечатал это с телефона, так как сейчас я в дороге, поэтому я не могу проверить этот фрагмент. Надеюсь, он передает концепцию.

Таким образом, он перебирает число байтов длины и будет использовать битовый сдвиг для старших битов и операцию и для младших битов. Я также добавил пробел, но его легко удалить, если он вам не нужен.
Примечание. Вы должны предварительно выделить 3*длину+1 байт для буфера.

person p4plus2    schedule 25.05.2014
comment
const char byte_map[16] = "0123456789abcdef"; или char *byte_map = "0123456789abcdef" намного короче - person phuclv; 25.05.2014
comment
Истинный. Его можно было бы даже полностью встроить и проиндексировать напрямую. Не уверен, почему я потрудился напечатать это. Должно быть, было очень скучно. - person p4plus2; 25.05.2014

sprintf("%X") будет преобразовывать для вас только одно целое число, и даже это будет сделано в соответствии с прямым порядком байтов (отсюда реверсирование) и без начальных нулей (отсюда иногда более короткий вывод). Вам понадобится цикл и печать каждого байта в формате %02x.

person Jester    schedule 24.05.2014
comment
я не могу преобразовать все 8192 байта одновременно? Я просто ищу самый быстрый способ прочитать весь файл и отобразить его на экране в шестнадцатеричном представлении. - person Darrin Woolit; 25.05.2014