通过我的一些旧的Delphi项目并将它们升级到D2009,因为我发现这个版本对所有以前的版本都是一个很大的改进(Generics.Collections - 哇!;)),我遇到了各种各样的问题。我设法解决了这个问题,但解决方案看起来并不像我认为的那样优雅。 (注意,我现在已经有三年没有编写Delphi代码了,甚至当时它还是非常业余的黑客,而不是深入了解正在发生的事情。)

我的代码将有一个TFileStream并从中读取。这些文件之前由我的旧Delphi应用程序编写,文件中的前三个字符将是CTR,以将文件类型识别为有效。读者会将前三个字节读入一个字符数组(这就是问题,现在sizeof(char)是2个字节),然后将此数组视为字符串,看它是否显示为“CTR”。

var ...
buffer: array[0..2] of char;
begin
...
InStream.read(buffer, 3);
if buffer <>'CTR' then begin ShowMessage('Not a valid file!'); exit; end;
...

这将编译并且它曾经工作但现在缓冲区实际上长度为6个字节,因此不等于“CTR”永远

我通过将缓冲区更改为 数组[0..2]来修复此问题,并引入了一些局部变量来执行以下操作:

for b in buffer do s := s + chr(b); //notice the for..in loop now available in D2009
if s<>'CTR'...

所以基本上我将单个字节转换为字符串然后进行比较,但必须有一种更简单的方法来执行此操作。你能否对这个问题有所了解?

有帮助吗?

解决方案

您可以将缓冲区设置为

var
  buffer: array[0..2] of AnsiChar;

你会读到与以前完全相同的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top