`

Delphi在二进制文件头部加数据或删除数据

 
阅读更多

今天想要在一个二进制文件头部加上一个特殊标志,在后续处理时又需要把该标志先移除。在网上搜了很久,没有很好的解决办法,最后想了个办法,用一个临时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 二进制图片存储和读取示例.rar

    Delphi XE10 二进制图片存储和读取的代码示例,二进制图片操作。主要就是流操作,代码注释里讲了几个注意的细节,附加测试数据库;Image 默认支持BMP JPG对象需显示的从文件流中初始化,Assign 在Image加载对象前 ...

    二进制文件操作

    在计算机科学领域,二进制文件操作是编程中不可或缺的一部分,尤其在低级系统编程或数据存储时。本文将深入探讨Delphi中的二进制文件阅读器,这是一种用于读取和解析二进制数据流的工具。二进制文件与文本文件不同,...

    以二进制方式读取图片并显示出来,Delphi源代码.rar

    在编程领域,尤其是在图形处理方面,以二进制...这个过程涉及的知识点涵盖了文件操作、二进制数据处理、图像格式解析以及Delphi的图形组件使用。如果你能理解和掌握这个过程,对于提升你的Delphi编程技能将大有裨益。

    Delphi中二进制串口通信编程方法

    然而,在实现串口通信时,尤其是在处理二进制数据时,Delphi的使用者往往面临一定的挑战。本文旨在详细介绍Delphi 6.0中二进制串口通信的编程方法,重点探讨使用MSComm控件实现二进制数据传输的技术细节,并通过具体...

    Delphi将图片以二进制方式存储在数据库BLOB字段中.rar

    在这个特定的案例中,"Delphi将图片以二进制方式存储在数据库BLOB字段中"是一个常见的实践,用于高效、安全地保存图片数据。BLOB(Binary Large Object)字段是数据库系统中用来存储大量二进制数据的类型,非常适合...

    Delphi进制转换,十进制,二进制,十六进制,字符串--超短精简

    在Delphi中,将一个整数转换成二进制字符串可以通过自定义函数实现。例如,`inttoBin`函数通过循环和模运算(取余)不断将整数除以2并记录下每次的余数,最后逆序组合成二进制字符串。 ```delphi function inttoBin...

    向数据库上传二进制文件 Delphi

    在使用Delphi 7开发应用程序时,经常需要处理与数据库交互的任务,其中之一就是将二进制文件(如图片、文档等)存储到SQL Server数据库中。这个过程涉及到数据流的操作,以便有效地传输和存储非结构化的二进制数据。...

    delphi读写sqlserver二进制字段image

    需要注意的是,Delphi中的TImage组件不能直接加载二进制数据,你需要先将二进制数据转换为图像文件,再加载到TImage组件。这可以通过创建一个临时文件,将二进制数据写入文件,然后使用TImage.LoadFromFile方法加载...

    将文件上传、下载(以二进制流保存到数据库)实现代码

    在讨论如何将文件上传、下载并以二进制流的方式保存到数据库中时,首先需要了解几个关键概念:文件上传、文件下载、二进制流以及数据库操作。 文件上传通常指的是将本地或者网络上的文件通过网络上传到服务器。在...

    Delphi 二进制图片的存储和读取

    Delphi 中的流操作是处理二进制数据的关键,它允许我们将数据写入到内存或文件中,然后在需要时读取出来。TStream 类是 Delphi 提供的基本流接口,常见的子类有 TMemoryStream(内存流)、TFileStream(文件流)等...

    webservice4 二进制文件读取

    在Web服务开发中,特别是基于Java的WebService,处理二进制文件(如图片、音频或视频文件)的传输是一个常见的需求。本文将详细讨论如何在WebService4中读取和传输二进制文件,以及涉及的相关技术。 首先,我们可以...

    Delphi以二进制方式读取图片并显示出来

    通过以上这些知识点,你可以实现一个 Delphi 应用程序,它能够以二进制方式读取图片文件,将其数据流转化为内存中的二进制或十六进制形式,并在界面上正确显示出来。这有助于深入理解二进制文件处理和图像显示的原理...

    delphi SPCOMM 发送16进制的方法

    在计算机领域,16进制常用来表示二进制数据,因为它更加简洁且人类可读性更强。 在Delphi中,串口通信通常使用TSerialPort组件,它是 Indy 或 VCL for the .NET Framework 库的一部分。要发送16进制数据,我们需要...

    Access数据库里二进制数据读取,并显示为图片.rar

    Access数据库中的二进制数据通常存储在“OLE对象”或“附件”字段中,用于存储图像、文档、音频或视频等非结构化数据。在Access中,我们可以使用VBA(Visual Basic for Applications)编程来读取和操作这些数据。 ...

    Delphi UDPServer 发送接收16进制数据

    在本文中,我们将深入探讨如何使用Delphi构建一个UDPServer来发送和接收16进制数据。Delphi是一款强大的Windows应用程序开发工具,它提供了丰富的组件库和编程接口,使得网络编程变得相对简单,尤其是UDP(用户数据...

    Delphi 二进制转换为十进制.rar

    Delphi7.0 如何将二进制转换为十进制呢?相信这个实例源码包会帮你大忙,用户输入任意二进制数,单击转换按钮,会立即显示出十进制数据.  function TForm1.BintoOct(L: string): integer;  var  i, j, t: integer;  ...

    Delphi字符串16进制互相转换

    在Delphi中,16进制字符串转换为整数或字节数组,以及将整数或字节数组转换为16进制字符串,有多种方法。我们可以使用系统提供的函数,如`Hex`和`IntToHex`来进行转换。 1. **16进制字符串转整数**: - 使用`...

    delphi 实现16进制的一个例子

    在Delphi编程环境中,16进制(Hexadecimal)是一种常用的表示数字的方式,尤其是在处理二进制数据或进行低级编程时。本示例将详细解释如何在Delphi中实现将其他类型的数据转换为16进制,并将其显示出来。 首先,...

    delphi10.3Idtcpclientto发送数据安卓客户端实例(加入十六进制).zip

    总结来说,这个压缩包文件提供了一个具体的示例,演示了如何在 Delphi 10.3 中使用 Indy 的 IdTCPClient 组件构建一个Android客户端,该客户端能够将数据转换为十六进制格式并发送给服务器。通过学习和理解这个实例...

Global site tag (gtag.js) - Google Analytics