procedure DecodeBookContentsdat(f:tmemorystream;var contentslist:tstrings);var outBuffer: Pointer; outSize: Integer; pstart:pdword; fsize:integer;begin fsize:=f.Size-$28 ; pstart:=pdword(integer(f.Memory)+$28 ); Decompressbuf(pstart, fSize ,0,outBuffer,outSize); f.Size := outSize; copymemory(f.Memory ,outbuffer,outsize); freemem(outbuffer); f.position:=0; contentslist.LoadFromStream(f);end; 大佬, 代码
就是一个zlib解压操作: [Asm] 纯文本查看 复制代码文件读写模式常量: 定义 常量 读取方式 = 0 定义 常量 写入方式 = 2 变量 声明 内存 变量 声明 文件句柄 调用 DLL函数 "kernel32.dll" 中的函数 GetFileSize, "msvcrt.dll" 中的函数 malloc 和 free 函数 GetFileSize(句柄, 高位字节指针, 低位字节指针) 函数 malloc(内存大小) 函数 free(内存指针) 文件句柄 = 打开文件("BookContents.dat", 读取方式) 如果 文件句柄 = 0 则 弹窗提示("无法打开文件") 结束程序 结束如果 内存大小 = 取文件长度(文件句柄) 内存 = malloc(内存大小) 读文件(文件句柄, 内存, 内存大小) 关闭文件(文件句柄) 变量 偏移地址 = 0x28 变量 pstart = 取子字节集(内存, 偏移地址, 内存大小 - 偏移地址) 变量 out_buffer 变量 压缩数据长度 变量 解压缩数据长度 = 内存大小 * 10 调用 DLL函数 "msvcrt.dll" 中的函数 c_zlib_uncompress 函数 c_zlib_uncompress(目标指针, 解压缩数据长度指针, 源指针, 压缩数据长度) 变量 缓冲区 = malloc(解压缩数据长度) 调用 DLL函数 "msvcrt.dll" 中的函数 memset 函数 memset(缓冲区, 0, 解压缩数据长度) 调用 DLL函数 "msvcrt.dll" 中的函数 c_zlib_uncompress(缓冲区, 解压缩数据长度指针, pstart, 压缩数据长度) out_buffer = 取字节集内容(缓冲区) 释放内存(缓冲区) 释放内存(内存) 打印文本(out_buffer)