C++ 对可执行文件进行编码

C++ 对可执行文件进行编码,c++,encoding,ascii,C++,Encoding,Ascii,我想对一个可执行文件进行编码和解码 问题是关于空的 文件内容为MZ(NULL),因此二进制代码将为 01001101 01011010 00000000 输出应为: 4d (for M -> 0100 1101) 5a(for Z -> 0101 1010) and 00(for NULL -> 0000 0000) 十六进制: 346435610000 但它是:346435613930 这是我的密码: CHAR* WriteBuffer = NULL

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

问题是关于空的

文件内容为MZ(NULL),因此二进制代码将为

01001101 01011010 00000000
输出应为:

4d (for M -> 0100 1101) 

5a(for Z -> 0101 1010) and 

00(for NULL -> 0000 0000)
十六进制:

346435610000 
但它是:
346435613930

这是我的密码:

    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]);
}
CHAR*WriteBuffer=NULL;
字节*ReadBuffer=NULL;
DWORD fSize=0;
重叠ol={0};
字节ASCITABLE[]={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);
对于(DWORD i=0;i15)
{
a=a/16;
}
wsprintfA(WriteBuffer,“%s%x”,WriteBuffer,ascitable[a]);
a=读取缓冲区[i]&0x0f;
wsprintfA(WriteBuffer,“%s%x”,WriteBuffer,ascitable[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);
}
/。。。。
int a=0;

对于(DWORD i=0;i我假定您分配了足够的缓冲区,并在写入WriteBuffer之前清除它

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

charascitable[]=“0123456789ABCDEF”;
德沃德j=0;
对于(DWORD i=0;i>4];
WriteBuffer[j++]=ascitable[ReadBuffer[i]&0x0f];
}
更新

抱歉,我误解了您的问题。您希望将空值(字节值0)解码为正好两个连续的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;
    }
}
dwordj=0;
对于(DWORD i=0;i>4];
WriteBuffer[j++]=ascitable[ReadBuffer[i]&0x0f];
}
其他的
{
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]);
}
#定义ASCII2BYTE(V)(((V)>'9')?(V)-'A':(V-'9'))

对于(DWORD i=0;i>1]=(ASCII2BYTE(ReadBuffer[i])12,比(4首先在
ReadBuffer
中取消引用
NULL
指针,然后尝试使用单个
字节作为写入地址。与
fSize
相同。您需要返回到一个更简单的指针教程,学习如何彻底处理指针。谢谢您,此算法更好,但它可以与NULL/I的相同问题一样,我在解码后对解码代码进行解码时也有问题,因此我们可以更好地理解该问题。如果fSize正确,则我提供的代码是正确的。因此,在您提供的示例中,请检查fSize是否等于3(字节)。当你解码时,你必须解码一个3*2=6字节的缓冲区。谢谢,我发布了我的解码代码,但它也不能正常工作,为什么100kb.exe文件需要花费太多时间,有没有更快的编码和解码方法?不客气。你的代码与编码器有相同的性能问题,你使用了“附加”具有O(n^2)复杂度的技术。代码和解码非常相似,以我的编码器代码为例,写下解码器。如果您认为我如何实现编码器,这很容易。请参阅更新III。请尝试执行代码。
#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]);
}