"元素数(256)与声明(65536)"迁移D2007到XE8不同

M S*_*kel 1 delphi unicode

我正在将代码从D2007迁移到XE8.我有一个使用此数据结构的函数:

Map: array[Char] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53,
  54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
  ..............
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0);
Run Code Online (Sandbox Code Playgroud)

以下是它的使用方法(S是一个字符串):

I := Map[S[1]] + (Map[S[2]] shl 6);
Run Code Online (Sandbox Code Playgroud)

当我尝试使用XE8编译时,我收到消息

元素数(256)与声明(65536)不同

我需要做些什么来编译和使用XE8?

And*_*and 12

这是Unicode引进德尔福2009年,您可以通过更换解决这个问题的结果Char通过AnsiChar,或者通过增加65 280项新的阵列.

在第一种情况下,你还应该注意到你应该S成为a AnsiString而不是(Unicode)string; 否则你可能会访问例如Map[chr(3653)]哪些不存在.


Dav*_*nan 7

char是字符类型的别名.在前Unicode中,Delphi char是8位AnsiChar类型的别名.在Unicode Delphi中,它是16位WideChar类型的别名.这解释了编译错误.

也许你实际上有二进制数据.在这种情况下,您应该停止使用字符串并使用字节数组.而不是char使用byte.而不是字符串使用TBytes,是TArray<byte>一个动态字节数组的别名.使用字符串数据类型来保存二进制数据的问题在于字符串受编码转换的影响.二进制数据需要以二进制数据类型保存.