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

您可以将文件加载到单字节有符号整数类型(也称为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 回答