sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server varbinary bigint con BitConverter.ToInt64 los valores son diferentes

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);