- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在读取一个文件,尝试通过检查前 n 个字节中的 NUL 字节来检查它是否是二进制文件,如果通过这种方式未确定它是二进制文件,则它作为字符串进行操作。我尝试循环一个字符串并检查第一个 n 索引是否为 NUL,但这会产生误报,而检查 TBytes
则不会。
我使用TFile.ReadAllBytes
,它返回一个TBytes
并对其执行NUL检查。然后,如果没有找到 NUL,我会在 TBytes
上使用 StringOf
来获取字符串。我想知道 StringOf
是否必须复制数据才能从中生成字符串(这些是大文件,所以我想避免这种情况),如果是这样,有什么更好的方法我正在尝试做什么。
最佳答案
Does StringOf make a copy of the data passed to it?
是的,according to the docs : '使用默认系统区域设置将字节数组转换为 Unicode 字符串。'
如果您只想将 TByte 作为字符串访问,为什么不将其转换为 PChar(如果是 Unicode)或 PAnsiChar(如果是 AnsiString)?
示例代码:
var
MyBuffer: TBytes;
BufferLength: integer;
BufferAsString: PChar;
BuferAsAnsiString: PAnsiChar;
begin
MyBuffer:= TFile.ReadAllBytes(Filename);
BufferLength:= SizeOf(MyBuffer);
BufferAsString:= PChar(@MyBuffer[0]);
BufferAsAnsiString:= PAnsiChar(@MyBuffer[0]);
//if there's no #0 at the end, make sure not to read past the end of the buffer!
编辑
我有点困惑,为什么你不只是使用 TFile.OpenRead
来获取 FileStream。
假设您有千兆字节的数据并且您很着急。
文件流将允许您只读取一小块数据,从而加快速度。
此示例代码读取整个文件,但可以轻松修改以仅获取一小部分:
var
MyData: TFileStream
MyString: string; {or AnsiString}
FileSize: integer;
Index: integer;
begin
MyData:= TFile.OpenRead(Filename);
try
FileSize:= MyData.GetSize;
SetLength(MyString,FileSize+1); //Preallocate the string;
Index:= 0;
MyData.Read(PChar(MyString[Index])^, FileSize);
finally
MyData.Free;
end;
//Do stuff with your newly read string.
请注意,最后一个示例仍然首先从磁盘读取所有数据(这可能是也可能不是您想要的)。不过,您也可以分块读取数据。
使用 AnsiStrings 所有这些都变得更简单,因为 1 个字符 = 1 个字节:-)。
关于string - StringOf 是否复制传递给它的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8614013/
我正在读取一个文件,尝试通过检查前 n 个字节中的 NUL 字节来检查它是否是二进制文件,如果通过这种方式未确定它是二进制文件,则它作为字符串进行操作。我尝试循环一个字符串并检查第一个 n 索引是否为
虽然试图找出一些 joda-time DateTime (时间戳格式)问题我打开了一个 REPL scala -cp joda-time-2.3.jar 忘记添加 joda-convert jar,并
我是一名优秀的程序员,十分优秀!