gpt4 book ai didi

c++ - 编码可执行文件

转载 作者:行者123 更新时间:2023-11-30 05:44:12 25 4
gpt4 key购买 nike

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

问题是关于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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com