今天想要在一个二进制文件头部加上一个特殊标志,在后续处理时又需要把该标志先移除。在网上搜了很久,没有很好的解决办法,最后想了个办法,用一个临时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 XE10 二进制图片存储和读取的代码示例,二进制图片操作。主要就是流操作,代码注释里讲了几个注意的细节,附加测试数据库;Image 默认支持BMP JPG对象需显示的从文件流中初始化,Assign 在Image加载对象前 ...
以流的方法向sql server数据库上传二进制文件 Delphi7语言编写
delphi二进制文件阅读器
Delphi进制转换,十进制,二进制,十六进制,字符串--超短精简
Delphi中二进制串口通信编程方法
Delphi以二进制方式读取图片并显示出来,读取图片文件为数据流,通过读取数据流转成十六进制或二进制。
使用delphi读写sqlserver中image字段,可以读取dmp,jpg,gif等格式的图片,至于二进制文件没有尝试过。
Delphi7.0 如何将二进制转换为十进制呢?相信这个实例源码包会帮你大忙,用户输入任意二进制数,单击转换按钮,会立即显示出十进制数据. function TForm1.BintoOct(L: string): integer; var i, j, t: integer; ...
Access数据库里二进制数据读取,并显示为图片
摘要:Delphi源码,图形处理,二进制 Delphi以二进制方式读取图片并显示出来,读取图片文件为数据流,通过读取数据流转成十六进制或二进制。
Delphi将图片以二进制方式存储在数据库BLOB字段中,将使用TStream读写数据,利用BLOB字段进行图像数据的存取,Blob存变量,具体程序请参考useBlob目录中的代码。
网上找了很多SPCOMM 发送16进制的方法,都不太理想,而且发送不成功, 因本人用在实际开发环境中需要测试16进制数据,于是自己写函数,实现这个功能,亲测比较稳定!
没用三方控件,只是udpserver的发送和接收。主要是16进制处理麻烦一点。注释写的很详细了,下载下来就可以直接用。
在delphi上实现把其它类型的数据转换16进制,在实现显示16进制数显示出来
delphi10.3Idtcpclientto发送数据安卓实例(加入十六进制) 客户端
XE10的,里面代码也适用7,主要就是流操作,代码注释里讲了几个注意的细节,附加测试数据库;
delphi编写的进制转换器,可以任意在2进制、8进制、10进制、16进制之间相互转换。
Delphi编写的一款 16进制文件编辑器源码,实现了类似WINHEX软件的功能,不过功能上没有WINHEX那么多,当初只是自己用的,在DELPHI7下编译成功。程序可以打开16进制文件并编辑修改,支持自动备份和翻页自动保存的功能...
Delphi通过 UDP 协议十六进制数据传输源程序,将数据转换成16进制进行传输,传输过程显示本地与远程文件信息,显示MAC地址,可以选择自动发送。