Casting fra varbinary
til bigint
(og tilbage) bruger netværksbyterækkefølge (big-endian).BitConverter
bruger endian-heden af den maskine, den køres på (little-endian for x86 og x64).
Derfor BitConverter.GetBytes
køre på -8588797048854775808 (0x88CE7696E7167800) er {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} og cast
på {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} er 0x0088E91869893177 =38536887891734903.
Den oplagte ting at gøre er at gemme 64-bit heltal som 64-bit heltal i første omgang.
Hvis du virkelig har brug for at udføre denne konvertering, så:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Skifter rundt på bytes, mens den også er bærbar ved, at den ikke vil bytte om bytes, hvis den køres på en big-endian-maskine.
Alternativt, hvis du af en eller anden grund ikke ønsker at bruge System.Net-navnerummet, eller hvis du ønsker at kunne udvides til andre typer end de tre IPAddress.HostToNetworkOrder
handles, brug:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);