今天想要在一个二进制文件头部加上一个特殊标志,在后续处理时又需要把该标志先移除。在网上搜了很久,没有很好的解决办法,最后想了个办法,用一个临时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加载对象前 ...
在计算机科学领域,二进制文件操作是编程中不可或缺的一部分,尤其在低级系统编程或数据存储时。本文将深入探讨Delphi中的二进制文件阅读器,这是一种用于读取和解析二进制数据流的工具。二进制文件与文本文件不同,...
在编程领域,尤其是在图形处理方面,以二进制...这个过程涉及的知识点涵盖了文件操作、二进制数据处理、图像格式解析以及Delphi的图形组件使用。如果你能理解和掌握这个过程,对于提升你的Delphi编程技能将大有裨益。
在这个特定的案例中,"Delphi将图片以二进制方式存储在数据库BLOB字段中"是一个常见的实践,用于高效、安全地保存图片数据。BLOB(Binary Large Object)字段是数据库系统中用来存储大量二进制数据的类型,非常适合...
然而,在实现串口通信时,尤其是在处理二进制数据时,Delphi的使用者往往面临一定的挑战。本文旨在详细介绍Delphi 6.0中二进制串口通信的编程方法,重点探讨使用MSComm控件实现二进制数据传输的技术细节,并通过具体...
在Delphi中,将一个整数转换成二进制字符串可以通过自定义函数实现。例如,`inttoBin`函数通过循环和模运算(取余)不断将整数除以2并记录下每次的余数,最后逆序组合成二进制字符串。 ```delphi function inttoBin...
在使用Delphi 7开发应用程序时,经常需要处理与数据库交互的任务,其中之一就是将二进制文件(如图片、文档等)存储到SQL Server数据库中。这个过程涉及到数据流的操作,以便有效地传输和存储非结构化的二进制数据。...
需要注意的是,Delphi中的TImage组件不能直接加载二进制数据,你需要先将二进制数据转换为图像文件,再加载到TImage组件。这可以通过创建一个临时文件,将二进制数据写入文件,然后使用TImage.LoadFromFile方法加载...
在讨论如何将文件上传、下载并以二进制流的方式保存到数据库中时,首先需要了解几个关键概念:文件上传、文件下载、二进制流以及数据库操作。 文件上传通常指的是将本地或者网络上的文件通过网络上传到服务器。在...
Delphi 中的流操作是处理二进制数据的关键,它允许我们将数据写入到内存或文件中,然后在需要时读取出来。TStream 类是 Delphi 提供的基本流接口,常见的子类有 TMemoryStream(内存流)、TFileStream(文件流)等...
在Web服务开发中,特别是基于Java的WebService,处理二进制文件(如图片、音频或视频文件)的传输是一个常见的需求。本文将详细讨论如何在WebService4中读取和传输二进制文件,以及涉及的相关技术。 首先,我们可以...
通过以上这些知识点,你可以实现一个 Delphi 应用程序,它能够以二进制方式读取图片文件,将其数据流转化为内存中的二进制或十六进制形式,并在界面上正确显示出来。这有助于深入理解二进制文件处理和图像显示的原理...
在计算机领域,16进制常用来表示二进制数据,因为它更加简洁且人类可读性更强。 在Delphi中,串口通信通常使用TSerialPort组件,它是 Indy 或 VCL for the .NET Framework 库的一部分。要发送16进制数据,我们需要...
Access数据库中的二进制数据通常存储在“OLE对象”或“附件”字段中,用于存储图像、文档、音频或视频等非结构化数据。在Access中,我们可以使用VBA(Visual Basic for Applications)编程来读取和操作这些数据。 ...
在本文中,我们将深入探讨如何使用Delphi构建一个UDPServer来发送和接收16进制数据。Delphi是一款强大的Windows应用程序开发工具,它提供了丰富的组件库和编程接口,使得网络编程变得相对简单,尤其是UDP(用户数据...
Delphi7.0 如何将二进制转换为十进制呢?相信这个实例源码包会帮你大忙,用户输入任意二进制数,单击转换按钮,会立即显示出十进制数据. function TForm1.BintoOct(L: string): integer; var i, j, t: integer; ...
在Delphi编程环境中,16进制(Hexadecimal)是一种常用的表示数字的方式,尤其是在处理二进制数据或进行低级编程时。本示例将详细解释如何在Delphi中实现将其他类型的数据转换为16进制,并将其显示出来。 首先,...
在Delphi中,16进制字符串转换为整数或字节数组,以及将整数或字节数组转换为16进制字符串,有多种方法。我们可以使用系统提供的函数,如`Hex`和`IntToHex`来进行转换。 1. **16进制字符串转整数**: - 使用`...
本篇文章将深入探讨在Delphi 7下如何开发TCP Socket进行二进制数据的收发,以及如何将其拓展到UDP通讯。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它确保了数据包的顺序传输...