一、读取二进制文件
第一种
var
FileStream: TFileStream;
Buffer: array of Byte;
begin
SetLength(Buffer, 0);
FileStream := TFileStream.Create(文件路径, $0000);
SetLength(Buffer, FileStream.Size);
FileStream.Read(Buffer[0], FileStream.Size);
//做处理
FileStream.free;
end;
第二种:
var
MemoryStream: TMemoryStream;
begin
MemoryStream := TMemoryStream.Create;
MemoryStream.LoadFromStream('');
MemoryStream.Position := 0; //起始位置
// 假设Stream是包含数据的流对象
SetLength(Buffer,0);
SetLength(Buffer, MemoryStream.Size);
MemoryStream.Read(Buffer[0], MemoryStream.Size);
MemoryStream.Seek(startLine, soBeginning);//起始行开始
MemoryStream.free;
end;
有些二进制文件需要去解析判断,比如字符串或者数字类型或者Ascal码等。分情况去转换
比如将stdf二进制流存储的字符串转换为文件:
procedure TForml.btnlclick(sender:Tobject);
var
open:
TopenDialog;
list:TstringList;
msUpload:TMemorvstream;
buff:
Dword;
begin
open :=TopenDialog.Create(nil);
list
:=TStringList.Create;
msUpload :=TMemorystream.create;
C1V
if not open.Execute then
Exit;多
list.Loadrromrile(open.rileName);
var icount :=li
while icount<=Length(list.strings[0])-l do
begin
buff := strToInt('$'+list.strings[0][icount]+list.strings[0][icount+1]);
msUpload.write(buff,1);//一个字符占2个字节
icount :=icount+2;//故加2
enc;
msUpload.saveTorile(open.rileName+'.pdf');
finally
open.Free;
list.free;
end:
end;
按照流的偏移量解析为10进制
function set_bin(offset, size: integer; Buffer: array of Byte): Integer;
var
Bf: array of Byte;
bigEndianValue: Cardinal;
littleEndianValue: Cardinal;
s: Integer;
begin
SetLength(Bf, size);
if size = 4 then
begin
Bf[0] := Buffer[offset];
Bf[1] := Buffer[offset + 1];
Bf[2] := Buffer[offset + 2];
Bf[3] := Buffer[offset + 3];
bigEndianValue := (Bf[0] shl 24) or (Bf[1] shl 16) or (Bf[2] shl 8) or Bf[3];
Result := bigEndianValue;
end;
if size = 2 then
begin
Bf[0] := Buffer[offset];
Bf[1] := Buffer[offset + 1];
Result := (uint16(Bf[0]) shl 8) or Bf[1];
end;
if size = 1 then
begin
Result := Buffer[offset];
end;
end;
做反解析就是
function strToHex(s: Dword; icount: integer): DWORD;
begin
var s1 := s;
var s2 := s;
var s3 := s;
var s4 := s;
case icount of
1:
Result := s;
2:
Result := ((s1 shr 8) and $FF) or ((s2 shl 8) and $FF00);
4:
Result := ((s1 shr 24) and $FF) or ((s2 shr 8) and $FF00) or ((s3 shl 8) and $FF0000) or ((s4 shl 24) and $FF000000);
end;
end;
二、写二进制文件:
var
msUpload: TMemoryStream;
begin
msUpload := TMemoryStream.create;
buff := strToHex(32, 1);//1byte
msUpload.Write(buff, 1);
buff := strToHex(32, 2);//2byte
msUpload.Write(buff, 2);
msUpload.Write(' ', 1);//写入字符串
msUpload.SaveToFile(文件路径);
msUpload.Free;//释放
end;