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.