存档为字节,字节到字符串没有延迟德尔福

时间:2012-11-05 16:52:14

标签: delphi

  

可能重复:
  Convert Array of ShortInt to String, Delphi

我想将文件转换为字符串,此字符串应包含与文件对应的数字(以字节为单位)。

我做了某种方式,但它很慢,使用FOR和ShortInt的数组......

示例:

我的计算机上有任何文件,我的目标是将其转换为Bytes,Bytes,这些应该在-127 ... 128之间,它会有这样的东西:

A[0] = 120
A[1] = -35
A[2] = 40

在这里吃好了,但我需要一个串联的字符串和它们之间的',',因此:

'120,-35,40'

我用'FOR'做了,但是如果你有另一种选择的话,它很慢。

2 个答案:

答案 0 :(得分:3)

此问题与您的previous question非常相似,但增加了从文件中读取数组的复杂性。

我可能会这样写:

function ConvertFileToCommaDelimitedArray(const FileName: string): string;
var
  i, BytesLeft, BytesRead: Integer;
  Buffer: array [0..4096-1] of Shortint;
  Stream: TFileStream;
  sb: TStringBuilder;
begin
  sb := TStringBuilder.Create;
  try
    Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try
      BytesLeft := Stream.Size;
      while BytesLeft>0 do
      begin
        BytesRead := Min(SizeOf(Buffer), BytesLeft)
        Stream.ReadBuffer(Buffer, BytesRead);
        dec(BytesLeft, BytesRead);
        for i := 0 to BytesRead-1 do
        begin
          sb.Append(IntToStr(Buffer[i]));
          sb.Append(',');
        end;
      end;
    finally
      Stream.Free;
    end;
    if sb.Length>0 then
      sb.Length := sb.Length-1;//remove trailing comma
    Result := sb.ToString;
  finally
    sb.Free;
  end;
end;

答案 1 :(得分:2)

您可以将文件加载到一个单字节有符号整数类型的数组中(也称为ShortInt),如下所示:

type
  TShortIntArray = array of TShortInt;

function LoadFileAsShortInt(const name: TFileName): TShortIntArray;
var
  f: TFileStream;
begin
  f := TFileStream.Create(name, fmOpenRead or fmShareDenyWrite);
  try
    SetLength(Result, f.Size);
    f.ReadBuffer(Result[0], f.Size);
  finally
    f.Free;
  end;
end;

如果您希望文件的内容为字符串,则应跳过该数组并将文件直接加载到字符串中:

function FileAsString(const name: TFileName): AnsiString;
var
  s: TStringStream;
begin
  s := TStringStream.Create;
  try
    s.LoadFromFile(name);
    Result := s.DataString;
  finally
    s.Free;
  end;
end;