繁体   English   中英

如何在 Delphi 中将“字符集”转换为“字节集”

[英]How to convert 'set of char' to 'set of byte' in Delphi

我是 Delphi 的新手。 我试图使用 RAD studio 编译示例代码,但出现编译器错误,提示类型不兼容。 我看到,代码试图将一个set of Char类型的变量分配给另一个set of Byte变量。

Values := ABC.allowedValues;

这里Valuesset of Byte allowedValuesset of Char

我找不到进行上述转换的方法。

很有可能(如“几乎可以肯定”),最好的解决方案是重新设计代码。 如果您确实需要这样做,则可能没有以最合适的方式完成。

此外,如果您使用的是新的 Delphi 版本(2009 或更高版本),则Char是一个两字节 Unicode 字符,因此不存在set of Char ,因为Z4C4A25318DB18E346DED 的基本类型必须设置是具有最多 256 个不同值的序数类型。 (两个字节意味着 65 536 个不同的值。)

然而,在 Delphi 2009 之前, Char确实是一个单字节字符; 在引擎盖下它只是一个Byte 今天, Char = WideCharAnsiChar是旧的单字节字符类型。

因此,让我们假设您使用的是 pre-Unicode Delphi 版本,或者您实际上正在使用set of AnsiChar 如果您在现代 Delphi 版本中编写set of Char ,编译器将“帮助”将其解释为set of AnsiChar并给您一个警告

执行转换的“缓慢”但真正类型安全的方法如下:

type
  TCharSet = set of AnsiChar;
  TByteSet = set of Byte;

function SetConvert(ACharSet: TCharSet): TByteSet;
begin
  Result := [];
  for var c in ACharSet do
    Include(Result, Ord(c))
end;

这利用了 Delphi 10.3 中引入的内联变量和 Delphi 2005 中引入的for..in循环(?)。 Pre-10.3,你需要写

function SetConvert(ACharSet: TCharSet): TByteSet;
var
  c: AnsiChar;
begin
  Result := [];
  for c in ACharSet do
    Include(Result, Ord(c))
end;

最后,严格来说,您的问题没有明确定义,因为您没有指定如何将 map 字符集转换为字节集。 上面,我假设您要使用由基本类型之间的Ord/Chr映射引起的映射。

变体 A:

uses
  System.SysUtils;

type
  TCharSet = set of AnsiChar;
  TByteSet = set of Byte;

  TMySet=packed record
   case char of
     'A': (a : TCharSet);
     'B': (b : TByteSet);
   end;

 var
  x: TMySet;
  i: integer;
begin
  try
    x.a := ['a', 'z', 'A'..'Z'];
    for i in x.b do
     write(i, ', ');

 except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
 end;

结尾。

变体 B:

uses
  System.SysUtils;

type
  TCharSet = set of AnsiChar;
  TByteSet = set of Byte;

var
  a: TCharSet;
  b: TByteSet absolute a;
  i: integer;
begin
  try
    a := ['a', 'z', 'A'..'Z'];
    for i in b do
      write(i, ', ');
  except
   on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM