**已关闭。**此问题为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减去这个结果,所以我可以在函数中做一个丑陋的整数数学修复,但它会更好-和更快-正确地做!
1条答案
按热度按时间u7up0aaq1#
AnsiChar(253)
的高位设置为1(%11111101
)。转换为有符号整数,当您将值转换为多字节整数(%11111111_11111101
)时,该位将扩展到更高的位,从而使整数为负。字节序列
$FD $27
(%11111101 %00100111
)被解释为 * 无符号 * 16位整数是64807,而 * 有符号 * 16位整数是-729。要在移位位时获得这种结果,请尝试在
Ord()
转换之后和移位之前屏蔽额外的位,例如: