Transmitindo de
varbinary
para bigint
(e vice-versa) usa ordem de bytes de rede (big-endian).BitConverter
usa o endian-ness da máquina em que é executado (little-endian para x86 e x64). Portanto,
BitConverter.GetBytes
executado em -8588797048854775808 (0x88CE7696E7167800) é {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} e cast
em {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} é 0x0088E91869893177 =38536887891734903. A coisa óbvia a fazer é apenas armazenar inteiros de 64 bits como inteiros de 64 bits em primeiro lugar.
Se você realmente precisa fazer essa conversão, então:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Trocará os bytes, além de ser portátil, pois não trocará os bytes se executado em uma máquina big-endian.
Como alternativa, se você não quiser usar o namespace System.Net por algum motivo, ou se quiser ser extensível a tipos diferentes dos três
IPAddress.HostToNetworkOrder
alças, use:var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);