0

これは本当にばかげた質問のように聞こえますが、単純な 16 進エディタを作成しようとしていて、ファイルからバイトを読み取ることができません。readfile api を使用して 8kb のバッファーを読み取り、次に 8kb を 16 進数に変換しようとしましたが、逆順で 4 バイトしか返されなかったり、0 になったりすることがあります。何が間違っているのかわかりません。どうすれば、16 進表現で完全な 8kb が得られる場所に到達できますか。ファイル全体を16進数に変換するより良い方法がある場合は、お知らせください。ファイル全体を読み取り、16 進数表現で画面に表示する最速の方法を探しています。ありがとう

FASM 構文ですが、簡単に C++ にすることもできます

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

すべてのデータは dd ですか?

更新 このように見えるmasm構文アセンブリを見つけたので、2番目の回答を回答としてマークしましたが、それは非常に高速でしたが、先に進んでCryptBinaryToString api http://msdn.microsoft.com/en-us/libraryを使用しました/windows/デスクトップ/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
4

2 に答える 2

1

sprintf("%X")単一の整数のみを変換しますが、それもリトル エンディアンに従って (したがって反転)、先行ゼロなしで行われます (したがって、出力が短くなることがあります)。ループが必要になり、%02xフォーマットを使用して各バイトを出力します。

于 2014-05-24T21:04:22.097 に答える
0

もう少し何かを自分のスタイルで行いますが、これでうまくいくはずです。

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;
}

私は今、遠征中であるため、携帯電話からこれを入力したため、このスニペットをテストすることはできません. うまくいけば、それはコンセプトを伝えます。

要約すると、長さ number のバイトをループし、上位ビットにはビット シフトを使用し、下位ビットには and 演算を使用します。スペースも追加しましたが、不要な場合は簡単に削除できます。
注: 3*長さ + 1 バイトをバッファーに事前に割り当てる必要があります。

于 2014-05-25T00:01:32.370 に答える