Delphi 读和写流

一、读取二进制文件 

第一种

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;

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值