2009-06-29 18 views
0

选择转换(VARBINARY(8)中,1)在MS SQL服务器产生输出:00000001数据集的TB的柱和SQL VARBINARY场组合

论在Delphi分配上述查询数据集,和访问字段值,我们得到字节数组为[1,0,0,0]。因此Bytes [0]包含1.

当我在这个字节数组上使用IntToHex()时,它会导致我的值为“10000000”。

为什么IntToHex会以相反顺序考虑它?

感谢&问候,

帕。

回答

2

我想你忘了在代码中加入一个引用,你在某个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; 

在此期间,我确定了我的答案来解释这一点。

0

这似乎是一个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帮助中)。

0

由于x86 CPU使用little-endian编号,因此编号系统按相反顺序排列其字节。您需要交换字节顺序以获得正确的值。