Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何将字节转换为二进制文件?(使用MemoryStream)_Delphi_File_Binary_Stream - Fatal编程技术网

Delphi 如何将字节转换为二进制文件?(使用MemoryStream)

Delphi 如何将字节转换为二进制文件?(使用MemoryStream),delphi,file,binary,stream,Delphi,File,Binary,Stream,如何使用MemoryStream将t字节类型转换为二进制文件?Delphi XE中的F.i.: procedure SaveBytesToFile(const Data: TBytes; const FileName: string); var stream: TBytesStream; begin stream := TBytesStream.Create(Data); try stream.SaveToFile(FileName); finally strea

如何使用
MemoryStream
t字节
类型转换为
二进制文件

Delphi XE中的F.i.:

procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
  stream: TBytesStream;
begin
  stream := TBytesStream.Create(Data);
  try
    stream.SaveToFile(FileName);
  finally
    stream.Free;
  end;
end;

如果您有TBytesStream可用,Uwe的答案将有效。如果没有:

procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
  stream: TMemoryStream;
begin
  stream := TMemoryStream.Create;
  try
    if length(data) > 0 then
      stream.WriteBuffer(data[0], length(data));
    stream.SaveToFile(FileName);
  finally
    stream.Free;
  end;
end;

或者直接使用
TFileStream
来减少创建的中间对象的数量:

procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    if Data <> nil then
      Stream.WriteBuffer(Data[0], Length(Data));
  finally
    Stream.Free;
  end;
end;
过程SaveBytesToFile(常量数据:TBytes;常量文件名:string);
变量
流:TFileStream;
开始
Stream:=TFileStream.Create(文件名,fmCreate);
尝试
如果数据为零,则
Stream.WriteBuffer(数据[0],长度(数据));
最后
免费;
结束;
结束;

我不认为在这里使用
TMemoryStream
是有帮助的,因为它只涉及额外的不必要的堆分配/释放。

好吧,如果答案提到Delphi XE和其他流而不是
TMemoryStream
,那么我建议另外一种方法

 procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
 begin
   TFile.WriteAllBytes( FileName, Data );
 end;

谢谢,但我说:
MemoryStream
。没有区别?是的,你是对的。但我只是想看看这是怎么可能的。当你使用SaveToFile时,TBytesStream或TMemoryStream会在后台创建一个TFileStream。像大卫·赫弗南(David Heffernan)所展示的那样,直接向TFileStream写信可能更好。我的回答的全部目的是表明,当你碰巧知道RTL时,答案实际上就在你的脚下。我不关心速度或内存方面的考虑,因为这不是问题的一部分。通常我会在必要时开始优化速度和空间。@Uwe我不知道
tbytestream
。是复制数据还是引用数据?谢谢David:)。哪一个更快?使用
TFileStream
TMemoryStream.SaveToFile
TMemoryStream.SaveToFile
通过
TFileStream
执行其工作。最好删去中间人,直接转到代码> TFILTSTRAM 。您可以考虑最后将IF子句移到尝试之外,因此,如果不编写任何内容,流将根本不会被创建。@您仍然需要创建一个空文件,而且由于这段代码做得很好,我不愿意为可能是罕见的情况添加另一个测试。为可能是罕见的情况添加另一个测试。@Kermia您知道您已经接受了最坏的答案性能特征@梅森,请不要生气!标题是:
使用MemoryStream
,我想我应该选择相关的答案。大卫:对于这个特殊的案子,是的。但是,如果有大量的单独写入,而不是一次写入,特别是如果它们是小的写入,则可以通过先将所有内容写入内存流,然后立即将其块写入文件来节省大量时间。@Kermia我对您接受的答案没有问题。我只是想确定您是否清楚,使用
TMemoryStream
是一种比必要的速度慢的解决方案。当你在评论中问到“哪个更快?”时,这似乎与你有关。您使用了错误的写入方法。您应该改用
WriteBuffer
,因为它是带有错误检查的。我相信您知道这一点,这是一个疏忽。“使用MemoryStream”是一个陷阱,使空间需求加倍