0

重複の可能性:
ShortIntの配列を文字列に変換、Delphi

ファイルを文字列に変換したいのですが、この文字列には、ファイルに対応する数値がバイト単位で含まれている必要があります。

私はある意味でやりましたが、FORとShortIntの配列を使用して非常に遅くなりました...

例:

私のコンピュータにファイルがある場合、私の目標はそれをバイトに変換することです。バイトは-127 .. 128の間にある必要があり、次のようになります。

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

ここで食べても大丈夫ですが、連結された文字列とその間に「、」が必要です。したがって、次のようになります。

'120,-35,40'

私は「FOR」でそれをしました、しかしあなたが別の選択肢を持っているならば、それは非常に遅かったです。

4

2 に答える 2

3

この質問は前の質問とかなり似ていますが、ファイルから配列を読み取る複雑さが増しています。

私はおそらく次のように書くでしょう:

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;
于 2012-11-05T17:40:27.407 に答える
2

次のように、ファイルを 1 バイトの符号付き整数型 ( としても知られる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;
于 2012-11-05T17:23:40.470 に答える