Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Varbinary bigint mit BitConverter.ToInt64-Werten sind unterschiedlich

Casting von varbinary zu bigint (und zurück) verwendet die Netzwerk-Byte-Reihenfolge (Big-Endian).BitConverter verwendet die Endian-Eigenschaften des Rechners, auf dem es ausgeführt wird (Little-Endian für x86 und x64).

Daher BitConverter.GetBytes ausgeführt auf -8588797048854775808 (0x88CE7696E7167800) ist {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} und cast auf {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} ist 0x0088E91869893177 =38536887891734903.

Das Offensichtliche ist, 64-Bit-Ganzzahlen überhaupt erst als 64-Bit-Ganzzahlen zu speichern.

Wenn Sie diese Konvertierung wirklich durchführen müssen, dann:

var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))

Vertauscht die Bytes und ist gleichzeitig portabel, da es die Bytes nicht vertauscht, wenn es auf einem Big-Endian-Rechner ausgeführt wird.

Alternativ, wenn Sie den System.Net-Namespace aus irgendeinem Grund nicht verwenden möchten oder wenn Sie auf andere Typen als die drei IPAddress.HostToNetworkOrder erweiterbar sein möchten handeles, verwenden Sie:

var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
  Array.Reverse(savedValue);