Itu penting. Anda ingin perbandingan Anda memiliki hasil yang sama dengan perbandingan SQL Server. SQL Server menggunakan perbandingan yang tidak ditandatangani pada jenis biner:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
Jika Anda melakukan hal yang sama dengan long
yang ditandatangani, 0xFFFFFFFFFFFFFFFF
mewakili -1
. Itu berarti perbandingan Anda akan salah; itu tidak akan cocok dengan perbandingan yang sama yang dilakukan di SQL Server.
Yang pasti Anda inginkan adalah menggunakan ulong
di mana 0xFFFFFFFFFFFFFFFF
adalah ulong.MaxValue
.
Endianness juga penting
Selain itu, seperti yang ditunjukkan Mark, BitConverter.GetUInt64
tidak mengkonversi dengan benar. Tandai tidak sepenuhnya benar - BitConverter
adalah big-endian atau little-endian tergantung pada sistem yang dijalankannya. Anda dapat melihatnya sendiri
. Juga, meskipun BitConverter selalu menjadi little-endian, Array.Reverse
kurang berperforma dengan alokasi tumpukan dan penyalinan byte demi byte. BitConverter
bukan alat yang tepat secara semantik atau praktis untuk pekerjaan itu.
Inilah yang Anda inginkan:
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];
}
Solusi terbersih
Perbarui :Jika Anda menggunakan .NET Core 2.1 atau yang lebih baru (atau .NET Standard 2.1), Anda dapat menggunakan BinaryPrimitives.ReadUInt64BigEndian
yang sangat cocok.
Pada .NET Framework, berikut adalah solusi yang saya gunakan:Timestamp.cs
. Pada dasarnya setelah Anda melakukan cast ke Timestamp
, Anda tidak bisa salah.