Trasmissione da varbinary
a bigint
(e viceversa) usa l'ordine dei byte di rete (big-endian).BitConverter
utilizza l'endian-ness della macchina su cui viene eseguito (little-endian per x86 e x64).
Quindi BitConverter.GetBytes
eseguito su -8588797048854775808 (0x88CE7696E7167800) è {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} e cast
su {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} è 0x0088E91869893177 =38536887891734903.
La cosa più ovvia da fare è innanzitutto memorizzare numeri interi a 64 bit come interi a 64 bit.
Se hai davvero bisogno di eseguire questa conversione, allora:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Scambia i byte, pur essendo portatile in quanto non scambia i byte se eseguito su una macchina big-endian.
In alternativa, se non vuoi utilizzare lo spazio dei nomi System.Net per qualche motivo, o se vuoi essere estensibile a tipi diversi dai tre IPAddress.HostToNetworkOrder
maniglie, usa:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);