[英]How to convert 'set of char' to 'set of byte' in Delphi
我是 Delphi 的新手。 我试图使用 RAD studio 编译示例代码,但出现编译器错误,提示类型不兼容。 我看到,代码试图将一个set of Char
类型的变量分配给另一个set of Byte
变量。
Values := ABC.allowedValues;
这里Values
是set of Byte
allowedValues
是set of Char
。
我找不到进行上述转换的方法。
很有可能(如“几乎可以肯定”),最好的解决方案是重新设计代码。 如果您确实需要这样做,则可能没有以最合适的方式完成。
此外,如果您使用的是新的 Delphi 版本(2009 或更高版本),则Char
是一个两字节 Unicode 字符,因此不存在set of Char
,因为Z4C4A25318DB18E346DED 的基本类型必须设置是具有最多 256 个不同值的序数类型。 (两个字节意味着 65 536 个不同的值。)
然而,在 Delphi 2009 之前, Char
确实是一个单字节字符; 在引擎盖下它只是一个Byte
。 今天, Char = WideChar
而AnsiChar
是旧的单字节字符类型。
因此,让我们假设您使用的是 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.