Det betyder noget. Du ønsker, at din sammenligning skal have samme resultat som SQL Servers sammenligning. SQL Server bruger usignerede sammenligninger på binære typer:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
Hvis du gør det samme med long som er underskrevet, 0xFFFFFFFFFFFFFFFF repræsenterer -1 . Det betyder, at din sammenligning vil være forkert; det vil ikke matche med den samme sammenligning udført i SQL Server.
Hvad du helt sikkert ønsker, er at bruge ulong hvor 0xFFFFFFFFFFFFFFFF er ulong.MaxValue .
Endianness er også vigtigt
Derudover, som Mark påpegede, BitConverter.GetUInt64 konverterer ikke korrekt. Mark har ikke helt ret - BitConverter er enten big-endian eller little-endian afhængigt af det system, den kører på. Du kan se dette selv
. Også selv om BitConverter altid var lille endian, Array.Reverse er mindre effektiv med en heap-allokering og byte-for-byte-kopiering. BitConverter er bare ikke semantisk eller praktisk det rigtige værktøj til jobbet.
Dette er, hvad du ønsker:
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];
}
Den reneste løsning
Opdater :Hvis du bruger .NET Core 2.1 eller nyere (eller .NET Standard 2.1), kan du bruge BinaryPrimitives.ReadUInt64BigEndian
hvilket er en perfekt pasform.
På .NET Framework er her den løsning, jeg bruger:Timestamp.cs
. Dybest set når du caster til Timestamp , du kan ikke gå galt.