在c ++或汇编(FASM)中将原始字节转换为十六进制

时间:2014-05-24 20:56:02

标签: c++ assembly io hex fasm

我知道这听起来像一个非常愚蠢的问题,但我正在尝试构建一个简单的十六进制编辑器,我无法从文件中读取字节。我使用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?

更新 我将第二个答案标记为answe,因为我发现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

2 个答案:

答案 0 :(得分:1)

sprintf("%X")只会为你转换一个整数,甚至可以根据小端(因此反转)和没有前导零(因此有时更短的输出)来完成。您将需要一个循环并使用%02x格式打印每个字节。

答案 1 :(得分: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;
}

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

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