C++ 对可执行文件进行编码
我想对一个可执行文件进行编码和解码 问题是关于空的 文件内容为MZ(NULL),因此二进制代码将为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
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]);
}