如何逐字节读取二进制文件?基于现有文本读取代码求改造
如何用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
相关产品推荐
相关产品推荐

