我想将文件转换为字符串,此字符串应包含与文件对应的数字(以字节为单位)。
我做了某种方式,但它很慢,使用FOR和ShortInt的数组......
示例:
我的计算机上有任何文件,我的目标是将其转换为Bytes,Bytes,这些应该在-127 ... 128之间,它会有这样的东西:
A[0] = 120
A[1] = -35
A[2] = 40
在这里吃好了,但我需要一个串联的字符串和它们之间的',',因此:
'120,-35,40'
我用'FOR'做了,但是如果你有另一种选择的话,它很慢。
答案 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;