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);