You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何逐字节读取二进制文件?基于现有文本读取代码求改造

如何用Delphi逐字节读取二进制文件

嘿,刚好你已经熟悉了文本文件的逐字符读取逻辑,那二进制文件的逐字节操作思路其实大同小异,但得换用专门的二进制文件处理方式——毕竟文本文件会自动处理换行、编码转换这些细节,而二进制文件需要原封不动读取每一个字节才行。

方法一:传统Pascal风格的File of Byte

这种方式和你之前的文本文件操作逻辑最贴近,直接把文件声明为字节类型的文件,就能轻松逐字节读取:

var
  BinFile: File of Byte;
  b: Byte;
begin
  // 指定要读取的二进制文件路径
  AssignFile(BinFile, 'Test.bin');
  // 以只读模式打开二进制文件
  Reset(BinFile);
  
  // 循环读取直到文件末尾
  while not Eof(BinFile) do
  begin
    // 读取单个字节到变量b中
    Read(BinFile, b);
    // 这里可以添加对字节b的处理逻辑,比如打印十六进制值、存储到数组等
    // 示例:输出当前字节的十六进制表示
    Writeln(IntToHex(b, 2));
  end;
  
  // 务必关闭文件
  CloseFile(BinFile);
end;

方法二:无类型文件(更灵活的传统方式)

如果需要更灵活的操作(比如后续可能一次性读取多个字节),也可以用无类型文件配合BlockRead来实现逐字节读取:

var
  BinFile: File;
  b: Byte;
begin
  AssignFile(BinFile, 'Test.bin');
  // 打开无类型文件,第二个参数指定记录大小为1字节
  Reset(BinFile, 1);
  
  while not Eof(BinFile) do
  begin
    // 读取1个记录(即1字节)到变量b中
    BlockRead(BinFile, b, 1);
    // 处理字节b...
  end;
  
  CloseFile(BinFile);
end;

方法三:现代Delphi推荐的TFileStream

如果你用的是较新的Delphi版本,更推荐使用TFileStream——这是VCL/FMX框架提供的文件流类,功能更强大,也更符合现代编程习惯:

uses
  System.Classes, System.IOUtils;

var
  Stream: TFileStream;
  b: Byte;
begin
  // 创建文件流,以只读模式打开(fmShareDenyWrite避免其他进程写入)
  Stream := TFileStream.Create('Test.bin', fmOpenRead or fmShareDenyWrite);
  try
    // 循环读取直到流的当前位置到达末尾
    while Stream.Position < Stream.Size do
    begin
      // 读取单个字节
      b := Stream.ReadByte;
      // 处理字节b...
    end;
  finally
    // 确保流资源被释放,避免内存泄漏
    Stream.Free;
  end;
end;

核心差异说明

和你之前的文本文件代码对比,关键区别在于:

  • 不能使用TextFile类型,因为它会对文本字符做编码转换、换行符处理,破坏二进制数据的完整性
  • 二进制文件没有“行”的概念,所以不需要处理Eoln(行结束),直接读到文件/流末尾即可

内容的提问来源于stack exchange,提问作者zac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:32:55