2009-06-29 7 views
0

select convert (varbinary (8), 1) in MS SQL Server erzeugt eine Ausgabe: 0x00000001Datensatz der TBytes Spalte und SQL VarBinary Feldkombination

Auf die obige Abfrage-Datensatz in Delphi Zuweisen und Feldwert zugreifen, erhalten wir Byte-Array als [1, 0, 0, 0]. Also Bytes [0] enthält 1.

Wenn ich IntToHex() für dieses Byte-Array verwenden, würde ich Wert als "10000000" ergeben.

Warum betrachtet IntToHex es in umgekehrter Reihenfolge?

Dank & Grüße,

Pavan.

Antwort

2

Ich glaube, Sie haben vergessen, einen Verweis auf den Code, wo Sie anrufen IntToHex auf einem TBytes Array. Es ist von der Antwort auf Ihre vorherige Frage, how to convert byte array to its hex representation in Delphi.

In my answer habe ich vergessen zu berücksichtigen, wie ein Zeiger auf ein Array von Bytes die Bytes in Big-Endian-Reihenfolge haben würde, während IntToHex (und alles andere auf x86) sie in Little-Endian-Reihenfolge erwartet. Die Lösung besteht darin, sie umzuschalten. Ich habe diese Funktion verwendet:

function Swap32(value: Integer): Integer; 
asm 
    bswap eax 
end; 

In der Zwischenzeit habe ich meine Antwort zu diesem Zweck behoben.

0

Dies scheint ein little/big endian Problem zu sein. Vertauschen Sie einfach das Byte-Array oder den Rückgabewert von IntToHex. Ein anderer Weg wäre, es selbst zu tun:

myInt = Bytes[0]; 
Inc(myInt, (Bytes[1] shl 8)); 
Inc(myInt, (Bytes[2] shl 16)); 
Inc(myInt, (Bytes[3] shl 24)); 

Seien Sie auch vorsichtig mit dem Zeichen. Ist der SQL-Wert signed oder unsigned - der Delphi-Datentyp sollte mit diesem übereinstimmen (int/longint ist signiert, Longword/Cardinal ist unsigned - siehe here oder in der Delphi-Hilfe).

0

Weil die x86-CPU Little-Endian-Nummern verwendet, ein Nummerierungssystem, das seine Bytes in umgekehrter Reihenfolge anordnet. Sie müssen die Byte-Reihenfolge vertauschen, um den richtigen Wert zu erhalten.

Verwandte Themen