Delphi字符现在以2个字节而不是1个存储在类型化的二进制文件中.我怎么还能读取我的旧文件?

Ins*_*ter 5 delphi binary delphi-2010

我维护一个Delphi程序,它使用类型化的二进制文件作为其本机文件格式.从Turbo Delphi升级到Delphi 2010后,存储的记录类型中的所有字符开始以2个字节而不是1个字节存储.

存储的数据类型是chararray[1..5] of char.

所以之前,文件的一部分看起来像:

4C 20 20 20 4E 4E 4E 4E
Run Code Online (Sandbox Code Playgroud)

现在它看起来像:

4C 00 20 00 20 00 20 00 4E 00 4E 00 4E 00 4E 00
Run Code Online (Sandbox Code Playgroud)

首先,为什么这首先发生?

其次,我怎么还能读取我的文件,记住现在宇宙中有旧文件和新文件?

我会在午餐后痴迷地监视这个问题.请随时在评论中询问更多信息.

Mas*_*ler 11

这种情况发生在Delphi 2009 中将默认字符串类型从AnsiString更改为UnicodeString时.听起来就像是在向文件写入字符串.在记录中重新声明它们,AnsiString它应该工作正常.

同样如此char.原始的char是一个AnsiChar,每个字符一个字节.现在默认的char是一个WideChar,它是一个UTF-16字符,每个字符2个字节.将您的char数组重新声明为数组,AnsiChar然后您将获得旧文件样式.

至于意识到两种风格都存在,这是一团糟.除非升级Delphi版本时文件中的版本号已被更改,否则我认为您唯一能做的就是扫描00字符数据中的字节,然后将其读入记录的一个AnsiChar或一个WideChar版本中根据它是否找到它.

  • 是否没有编译器开关来获取旧的字符大小? (3认同)
  • @Daniel:这是一个非常大的问题.unicode升级是一个非常重要的事情,unicode字符串现在是默认的字符串类型.最好在内部使用unicode字符串和unicode字符.您可以使用强制转换轻松地在unicode和ansi之间进行转换.有关一些有用的提示,请参阅http://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf上的Cary Jensen的文章. (2认同)