0

我知道这听起来像是一个非常愚蠢的问题,但我正在尝试构建一个简单的十六进制编辑器,但我无法从文件中读取字节。我使用 readfile api 读取 8kb 缓冲区,然后我打算将 8kb 转换为十六进制,但它有时只给我 4 个字节以相反的顺序或有时 0 我不确定我做错了什么。我怎样才能得到它,它将给我完整的 8kb 十六进制表示。如果他们是将整个文件转换为十六进制的更好方法,请告诉我。我只是在寻找读取整个文件并以十六进制表示形式在屏幕上显示的最快方法。谢谢

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 语法程序集看起来像这样,而且速度非常快,但我继续使用 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;
}

因为我现在正在公路旅行中,所以从我的手机上输入了这个,所以我无法测试这个片段。希望它传达了这个概念。

总之,它循环遍历长度字节数,并将对高位使用位移位,对低位使用 and 操作。我还添加了一个空格,但如果你不想要它应该很容易删除。
注意:您必须预先分配 3*length+1 个字节到缓冲区。

于 2014-05-25T00:01:32.370 回答