Casten vanuit varbinary
naar bigint
(en terug) gebruikt netwerkbytevolgorde (big-endian).BitConverter
gebruikt de endian-heid van de machine waarop deze draait (little-endian voor x86 en x64).
Vandaar BitConverter.GetBytes
uitgevoerd op -8588797048854775808 (0x88CE7696E7167800) is {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77}, en cast
op {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} is 0x0088E91869893177 =38536887891734903.
Het ligt voor de hand om in de eerste plaats 64-bits gehele getallen op te slaan als 64-bits gehele getallen.
Als je deze conversie echt moet doen:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Zal de bytes omwisselen, terwijl het ook draagbaar is omdat het de bytes niet zal verwisselen als het op een big-endian-machine wordt uitgevoerd.
Als alternatief, als u de System.Net-naamruimte om de een of andere reden niet wilt gebruiken, of als u uitbreidbaar wilt zijn naar andere typen dan de drie IPAddress.HostToNetworkOrder
handeles, gebruik:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);