为什么我的HexToInt函数在 Delphi 64位中失败,而它在32位中工作?[关闭]

kt06eoxx  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(169)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答复。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
2天前关闭。
Improve this question
Delphi 64位中的HexToInt
我有一个HexToInt函数,它在 Delphi 32位中处理二进制数据,但在Delphi 64位中处理负值时失败:

function HexToInt(MSC, LSC: ANSIChar): Smallint;
begin
result := ord(MSC);
result := (result shl 8) or ord(LSC);
end;

例如,对于二进制字符串ý '(chr(253)& chr(39)),此函数返回-729,但在64位中尝试相同的函数会产生范围错误。我尝试使用Integer和LongInt作为返回值,它确实给予 a 值(64807),但不是正确的。

  • 我现在意识到正确的结果= 65536减去这个结果,所以我可以在函数中做一个丑陋的整数数学修复,但它会更好-和更快-正确地做!
u7up0aaq

u7up0aaq1#

AnsiChar(253)的高位设置为1(%11111101)。转换为有符号整数,当您将值转换为多字节整数(%11111111_11111101)时,该位将扩展到更高的位,从而使整数为负。
字节序列$FD $27%11111101 %00100111)被解释为 * 无符号 * 16位整数是64807,而 * 有符号 * 16位整数是-729。
要在移位位时获得这种结果,请尝试在Ord()转换之后和移位之前屏蔽额外的位,例如:

function HexToInt(MSC, LSC: AnsiChar): Smallint;
begin
  Result := Ord(MSC) and $FF;
  Result := (Result shl 8) or (Ord(LSC) and $FF);
end;

相关问题