選擇轉換(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編號,因此編號系統按相反順序排列其字節。您需要交換字節順序以獲得正確的值。