Transmitiendo desde varbinary
a bigint
(y viceversa) utiliza el orden de bytes de la red (big-endian).BitConverter
usa el endian-ness de la máquina en la que se ejecuta (little-endian para x86 y x64).
Por lo tanto BitConverter.GetBytes
ejecutar en -8588797048854775808 (0x88CE7696E7167800) es {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} y cast
en {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} es 0x0088E91869893177 =38536887891734903.
Lo más obvio es almacenar enteros de 64 bits como enteros de 64 bits en primer lugar.
Si realmente necesita hacer esta conversión, entonces:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Intercambiará los bytes, mientras que también es portátil, ya que no intercambiará los bytes si se ejecuta en una máquina big-endian.
Alternativamente, si no desea utilizar el espacio de nombres System.Net por algún motivo, o si desea ser extensible a tipos distintos de los tres IPAddress.HostToNetworkOrder
manijas, use:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);