重要です。 比較の結果をSQLServerの比較と同じにする必要があります。 SQL Serverは、バイナリタイプで符号なし比較を使用します:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
long
で同じことをする場合 署名されている、0xFFFFFFFFFFFFFFFF
-1
を表します 。つまり、比較は正しくありません。 SQLServerで行われた同じ比較とは一致しません。
絶対に必要なのは、 ulong
を使用することです ここで、0xFFFFFFFFFFFFFFFF
ulong.MaxValue
です 。
エンディアンも重要です
さらに、マークが指摘したように、BitConverter.GetUInt64
正しく変換されていません。マークは完全に正しくない -BitConverter
実行しているシステムに応じて、ビッグエンディアンまたはリトルエンディアンのいずれかになります。 これを自分で確認
できます 。また、BitConverterが常にリトルエンディアンであったとしても、Array.Reverse
ヒープ割り当てとバイトごとのコピーではパフォーマンスが低下します。 BitConverter
意味的にも実際的にもその仕事に適したツールではありません。
これはあなたが望むものです:
static ulong BigEndianToUInt64(byte[] bigEndianBinary)
{
return ((ulong)bigEndianBinary[0] << 56) |
((ulong)bigEndianBinary[1] << 48) |
((ulong)bigEndianBinary[2] << 40) |
((ulong)bigEndianBinary[3] << 32) |
((ulong)bigEndianBinary[4] << 24) |
((ulong)bigEndianBinary[5] << 16) |
((ulong)bigEndianBinary[6] << 8) |
bigEndianBinary[7];
}
最もクリーンなソリューション
更新 :.NET Core 2.1以降(または.NET Standard 2.1)を使用している場合は、 BinaryPrimitives.ReadUInt64BigEndian
これは完璧にフィットします。
.NET Frameworkで使用するソリューションは、次のとおりです。 Timestamp.cs
。基本的に、Timestamp
にキャストすると 、間違いはありません。