Odesílání z varbinary
na bigint
(a zpět) používá síťové pořadí bajtů (big-endian).BitConverter
používá endian-ness stroje, na kterém běží (little-endian pro x86 a x64).
Proto BitConverter.GetBytes
spustit na -8588797048854775808 (0x88CE7696E7167800) je {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} a cast
na {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} je 0x0088E91869893177 =38536887891734903.
Zřejmá věc, kterou musíte udělat, je uložit 64bitová celá čísla jako 64bitová celá čísla.
Pokud opravdu potřebujete provést tento převod, pak:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Bude swapovat kolem bajtů a zároveň je přenosný v tom, že nezamění bajty, pokud bude spuštěn na stroji big-endian.
Případně, pokud z nějakého důvodu nechcete používat jmenný prostor System.Net nebo pokud chcete být rozšiřitelný na jiné typy než tři IPAddress.HostToNetworkOrder
kliky, použijte:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);