Castar från varbinary
till bigint
(och tillbaka) använder nätverksbyteordning (big-endian).BitConverter
använder endian-heten för maskinen den körs på (little-endian för x86 och x64).
Därav BitConverter.GetBytes
körs på -8588797048854775808 (0x88CE7696E7167800) är {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} och cast
på {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} är 0x0088E91869893177 =38536887891734903.
Det självklara att göra är att bara lagra 64-bitars heltal som 64-bitars heltal i första hand.
Om du verkligen behöver göra den här konverteringen:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Kommer att byta runt byte, samtidigt som den är portabel genom att den inte kommer att byta byte om den körs på en big-endian-maskin.
Alternativt, om du inte vill använda System.Net-namnutrymmet av någon anledning, eller om du vill kunna utökas till andra typer än de tre IPAddress.HostToNetworkOrder
handeles, använd:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);