Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server varbinary bigint com valores BitConverter.ToInt64 são diferentes


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