varbinary
からのキャスト bigint
へ (およびその逆)ネットワークバイトオーダー(ビッグエンディアン)を使用します。BitConverter
実行されているマシンのエンディアンを使用します(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名前空間を使用したくない場合、または3つのIPAddress.HostToNetworkOrder
以外のタイプに拡張できるようにしたい場合 ハンデレス、使用:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);