今天想要在一个二进制文件头部加上一个特殊标志,在后续处理时又需要把该标志先移除。在网上搜了很久,没有很好的解决办法,最后想了个办法,用一个临时Stream来处理。上代码:
const EncFileHeader = '1234567890'; //特殊标志 function EncryptFile(inFile, outFile: PChar; password: PChar): Boolean; stdcall; var output: TFileStream; input: TFileStream; AES: TAESFull; bFlag: Boolean; keySize: integer; Pass: String; Digest: TSHA256Digest; ret: Integer; tmpStream: TMemoryStream; begin Pass := Password; SHA256Weak(Pass, Digest); Result := True; if inFile = outFile then begin Result := False; Exit; end; bFlag := True; keySize := sizeof(Digest)*8; if keySize <128 then keySize := 128; tmpStream := TMemoryStream.Create; try input := TFileStream.Create (inFile, fmOpenRead); output := TFileStream.Create (outFile, fmCreate); ret := AES.EncodeDecode (Digest, keySize, input.Size, bFlag, input, output, nil, nil); //往输出文件头中写入特殊标志 output.Seek(0, soFromBeginning); tmpStream.Write(EncFileHeader, length(EncFileHeader)); tmpStream.CopyFrom(output, output.Size); output.Free; output := TFileStream.Create (outFile, fmCreate); tmpStream.Seek(0, soFromBeginning); output.CopyFrom(tmpStream, tmpStream.Size); //写入特殊标志结束 if ret<>0 then Result := False; finally input.Free; output.Free; tmpStream.Free; end; end; function EncFile(inFile, outFile: PChar): Boolean; stdcall; begin Result := EncryptFile(inFile, outFile, PChar(GetEK())); end; function DecryptFile(inFile, outFile: PChar; password: PChar): Boolean; stdcall; var output: TFileStream; input: TFileStream; tmpStream: TStringStream; AES: TAESFull; bFlag: Boolean; keySize: integer; Pass: String; Digest: TSHA256Digest; ii, ret: Integer; Buffer: array of byte; sTmp: String; begin Pass := Password; SHA256Weak(Pass, Digest); Result := True; if inFile = outFile then begin Result := False; Exit; end; bFlag := False; keySize := sizeof(Digest)*8; if keySize <128 then keySize := 128; SetLength(Buffer, Length(EncFileHeader)); try input := TFileStream.Create (inFile, fmOpenRead); output := TFileStream.Create (outFile, fmCreate); //把文件头上特殊标志移除(跳过) tmpStream := TStringStream.Create(''); if input.Size > Length(EncFileHeader) then begin tmpStream.CopyFrom(input, Length(EncFileHeader)); if tmpStream.DataString <> EncFileHeader then begin //当文件头部信息与特殊标志不相符时,认为没有特殊标志,则把指针指回到0,让后续代码从头开始处理流; //否则,后续代码从当前位置开始处理,即跳过了特殊标志 tmpStream.Seek(0, soFromBeginning); end; end; ret := AES.EncodeDecode (Digest, keySize, input.Size, bFlag, input, output, nil, nil); if ret<>0 then Result := False; finally input.Free; output.Free; tmpStream.Free; end; end;
相关推荐
综上所述,这个主题涵盖了Delphi编程、PE文件结构、文件I/O以及资源管理等多个方面,是深入学习系统编程和二进制文件操作的一个实例。通过这样的实践,开发者可以增强对PE文件格式的理解,并掌握在Delphi中处理这类...
Base64是一种用于在网络上传输二进制数据的编码方式,它将任意的二进制数据转换成可打印的ASCII字符序列。这个过程通常用于在邮件系统、HTTP头部或者HTML中传输图片、文档等非文本内容。在描述的场景中,我们有两个...
"资源"可能指的是安装包中除了二进制文件之外的其他文件,如帮助文档、示例代码或图标等。 在压缩包的文件名称列表中: - `layout.bin` 可能是保存控件布局信息的文件,用于恢复或保存自定义的网格布局设置。 - `...
详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...