Прехвърляне от varbinary
към bigint
(и обратно) използва мрежов ред на байтовете (big-endian).BitConverter
използва endian-ness на машината, на която се изпълнява (little-endian за x86 и x64).
Следователно BitConverter.GetBytes
изпълнение на -8588797048854775808 (0x88CE7696E7167800) е {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} и cast
на {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} е 0x0088E91869893177 =38536887891734903.
Очевидното нещо, което трябва да направите, е просто да съхраните 64-битовите цели числа като 64-битови цели числа.
Ако наистина трябва да направите това преобразуване, тогава:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Ще разменя байтовете, като същевременно е преносим, тъй като няма да разменя байтовете, ако се изпълнява на машина с голям ред.
Като алтернатива, ако не искате да използвате пространството от имена на System.Net по някаква причина или ако искате да бъдете разширими за типове, различни от трите IPAddress.HostToNetworkOrder
handeles, използвайте:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);