c++ - 编码可执行文件

标签 c++ encoding ascii

我想编码和解码一个可执行文件

问题是关于NULL

文件内容为MZ(NULL) 所以二进制代码为

01001101 01011010 00000000

输出应该是:

4d (for M -> 0100 1101) 

5a(for Z -> 0101 1010) and 

00(for NULL -> 0000 0000)

十六进制:

346435610000 

但它是:346435613930

enter image description here

这是我的代码:

    CHAR* WriteBuffer = NULL;
BYTE *ReadBuffer = NULL;
DWORD fSize = 0;
OVERLAPPED ol = {0};
BYTE AsciiTable[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF};
int a = 0;
//...
ReadFile(hndlRead, *ReadBuffer, *fSize, NULL, &ol);

for(DWORD i=0; i< fSize; i++)
{
    a = ReadBuffer[i]& 0xf0;

    if (a > 15)
    {
        a = a / 16;
    }
    wsprintfA(WriteBuffer, "%s%x", WriteBuffer, AsciiTable[a]);
    a = ReadBuffer[i] & 0x0f;
    wsprintfA(WriteBuffer, "%s%x", WriteBuffer, AsciiTable[a]);
}

编辑/解码:

我想使用 AsciiTable 进行解码,但我不能,所以我以这种形式解码:

//....
int a = 0;
for(DWORD i=0; i<dwFileSize; i++)
{
    sscanf_s((CHAR*)ReadBuffer + i*2 ,"%02x" , &a);             
    wsprintfA(szWriteBuffer, "%s%c", szWriteBuffer, a);
}

最佳答案

我假设您分配了足够的缓冲区并在写入 WriteBuffer 之前将其清除。

性能问题:你的算法是O(n^2),最好用这个,是O(n):

CHAR AsciiTable[] = '0123456789ABCDEF';

DWORD j=0;
for(DWORD i=0; i< fSize; i++)
{
    WriteBuffer[j++]=AsciiTable[ReadBuffer[i]>>4];
    WriteBuffer[j++]=AsciiTable[ReadBuffer[i]&0x0f];
}

更新

对不起,我误解了你的问题。您想要将 NULL 值(字节值 0)解码为恰好 2 个连续的 0 值。在这种情况下,试试这个:

DWORD j=0;
for(DWORD i=0; i< fSize; i++)
{
    if (ReadBuffer[i])
    {
        WriteBuffer[j++]=AsciiTable[ReadBuffer[i]>>4];
        WriteBuffer[j++]=AsciiTable[ReadBuffer[i]&0x0f];
    }
    else 
    {
        WriteBuffer[j++]=WriteBuffer[j++]=0;
    }
}

更新二:解码器代码

正如所问,这是 O(n) 的解码代码,而不是 O(n^2) 编写的版本。

#define ASCII2BYTE(V) (((V)>'9')?(V)-'A':(V-'9')

for (DWORD i=0;i<dwFileSize;i+=2)
{
    szWriteBuffer[i>>1]=(ASCII2BYTE(ReadBuffer[i])<<4)+ASCII2BYTE(ReadBuffer[i+1]);
}

更新 III:ASCII2BYTE 宏如何工作(按要求)

要转换 4D5A,请尝试使用 ReadBuffer="4D5A", dwFileSize=4 执行解码代码;每对字符都被取出,然后第一个是最高有效半字节(= 4 位)并从 ASCII 转换为十进制('4'--> 4),然后第二个字符 'D' 被转换为最低有效半字节,('D'-->12),比 (4<<4)+12 = 76,这正是 'M' 的 ascii 码。 5A也一样

关于c++ - 编码可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29892211/

相关文章:

c++ - 无法使用Direct2D png的DirectX9绘制图像 Sprite

C++模板方法及获取结果——设计

java - 阿拉伯语文本显示为 ???在安卓中

javascript - window.location.hash 的编码

python3 : How to convert a string with Unicode encoding to a string of letters

c++ - 为什么要打印 ascii 范围之外的数字?

c++ - ofstream.is_open() 在使用 VS 2015 的 DirectX12 应用程序中始终为 false

c++ - 哪种整数数据类型最有效地使用 x64 CPU 内核?

java - (Intellij) 编译时为 "unclosed character literal"和 "illegal character '\u00a 7'"

ascii - 在现代编程中使用 ASCII 分隔符 (29-31)