选择转换(VARBINARY(8)中,1)在MS SQL服务器产生输出:00000001数据集的TB的柱和SQL VARBINARY场组合
论在Delphi分配上述查询数据集,和访问字段值,我们得到字节数组为[1,0,0,0]。因此Bytes [0]包含1.
当我在这个字节数组上使用IntToHex()时,它会导致我的值为“10000000”。
为什么IntToHex会以相反顺序考虑它?
感谢&问候,
帕。
选择转换(VARBINARY(8)中,1)在MS SQL服务器产生输出:00000001数据集的TB的柱和SQL VARBINARY场组合
论在Delphi分配上述查询数据集,和访问字段值,我们得到字节数组为[1,0,0,0]。因此Bytes [0]包含1.
当我在这个字节数组上使用IntToHex()时,它会导致我的值为“10000000”。
为什么IntToHex会以相反顺序考虑它?
感谢&问候,
帕。
我想你忘了在代码中加入一个引用,你在某个TBytes
阵列上调用IntToHex
。这是从您的上一个问题的答案,how to convert byte array to its hex representation in Delphi。
在my answer中,我忘记了如何指示一个字节数组如何以big-endian顺序来存储字节,而IntToHex
(以及x86上的其他所有内容)都希望它们按小端顺序排列。解决方案是切换它们。我使用了这个功能:
function Swap32(value: Integer): Integer;
asm
bswap eax
end;
在此期间,我确定了我的答案来解释这一点。
这似乎是一个little/big endian的问题。只需从IntToHex中反转字节数组或返回值即可。另一种方式是自己动手:
myInt = Bytes[0];
Inc(myInt, (Bytes[1] shl 8));
Inc(myInt, (Bytes[2] shl 16));
Inc(myInt, (Bytes[3] shl 24));
另外要小心的迹象。 SQL值是带符号还是无符号 - Delphi数据类型应该与此匹配(int/longint已签名,Longword/Cardinal未签名 - 请参阅here或在Delphi帮助中)。
由于x86 CPU使用little-endian编号,因此编号系统按相反顺序排列其字节。您需要交换字节顺序以获得正确的值。