Przesyłanie z varbinary
do bigint
(i z powrotem) używa sieciowej kolejności bajtów (big-endian).BitConverter
używa endianowości maszyny, na której działa (little-endian dla x86 i x64).
Stąd BitConverter.GetBytes
Uruchom na -8588797048854775808 (0x88CE7696E7167800) to {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} i cast
na {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} to 0x0088E91869893177 =38536887891734903.
Oczywistą rzeczą do zrobienia jest po prostu przechowywanie 64-bitowych liczb całkowitych jako 64-bitowych liczb całkowitych.
Jeśli naprawdę potrzebujesz wykonać tę konwersję, to:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Zamienia bajty, a jednocześnie jest przenośny, ponieważ nie zamieni bajtów, jeśli zostanie uruchomiony na maszynie typu big-endian.
Alternatywnie, jeśli z jakiegoś powodu nie chcesz używać przestrzeni nazw System.Net lub jeśli chcesz być rozszerzalny na typy inne niż trzy IPAddress.HostToNetworkOrder
uchwyty, użyj:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);