varbinary
から(およびその逆) へのキャストにbigint
は、ネットワーク バイト オーダー (ビッグ エンディアン) が使用されます。
BitConverter
実行されているマシンのエンディアンを使用します (x86 および x64 のリトルエンディアン)。
Hence BitConverter.GetBytes
run on -8588797048854775808 (0x88CE7696E7167800) is {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77}, and cast
on {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} is 0x0088E91869893177 = 38536887891734903 .
やるべきことは明らかで、最初から 64 ビット整数を 64 ビット整数として格納するだけです。
本当にこの変換を行う必要がある場合:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
バイトをスワップしますが、ビッグエンディアン マシンで実行した場合にバイトをスワップしないという点で移植性もあります。
または、何らかの理由で System.Net 名前空間を使用したくない場合、または 3 つのハンドル以外の型に拡張可能にしたい場合は、IPAddress.HostToNetworkOrder
次を使用します。
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);