Na tom záleží. Chcete, aby vaše srovnání mělo stejný výsledek jako porovnání SQL Server. SQL Server používá nepodepsané porovnání binárních typů:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
Pokud uděláte totéž s long
který je podepsaný, 0xFFFFFFFFFFFFFFFF
představuje -1
. To znamená, že vaše srovnání bude nesprávné; nebude se shodovat se stejným porovnáním provedeným na serveru SQL.
Co určitě chcete, je použít ulong
kde 0xFFFFFFFFFFFFFFFF
je ulong.MaxValue
.
Endianness je také důležitý
Navíc, jak Mark zdůraznil, BitConverter.GetUInt64
nepřevádí správně. Mark nemá úplnou pravdu - BitConverter
je buď big-endian nebo little-endian v závislosti na systému, na kterém běží. Můžete sami se o tom přesvědčit
. Také, i když byl BitConverter vždy little-endian, Array.Reverse
je méně výkonný s alokací haldy a kopírováním bajt po bajtu. BitConverter
prostě není sémanticky ani prakticky tím správným nástrojem pro danou práci.
To je to, co chcete:
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];
}
Nejčistší řešení
Aktualizovat :Pokud používáte .NET Core 2.1 nebo novější (nebo .NET Standard 2.1), můžete použít BinaryPrimitives.ReadUInt64BigEndian
což se perfektně hodí.
Na .NET Framework používám toto řešení:Timestamp.cs
. V podstatě po odeslání do Timestamp
, nemůžete udělat chybu.