Es spielt eine Rolle. Ihr Vergleich soll dasselbe Ergebnis haben wie der Vergleich von SQL Server. SQL Server verwendet vorzeichenlose Vergleiche für binäre Typen:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
Wenn Sie dasselbe mit long machen die signiert ist, 0xFFFFFFFFFFFFFFFF steht für -1 . Das bedeutet, dass Ihr Vergleich falsch sein wird; es stimmt nicht mit dem gleichen Vergleich überein, der in SQL Server durchgeführt wird.
Was Sie auf jeden Fall wollen, ist ulong zu verwenden wobei 0xFFFFFFFFFFFFFFFF ist ulong.MaxValue .
Endianness ist auch wichtig
Zusätzlich, wie Mark betonte, BitConverter.GetUInt64 konvertiert nicht richtig. Mark hat nicht ganz recht - BitConverter ist entweder Big-Endian oder Little-Endian, je nachdem, auf welchem System es läuft. Sie können sich selbst davon überzeugen
. Auch wenn BitConverter immer Little-Endian war, Array.Reverse ist mit einer Heap-Zuordnung und byteweisem Kopieren weniger leistungsfähig. BitConverter ist einfach weder semantisch noch praktisch das richtige Werkzeug für den Job.
Das wollen Sie:
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];
}
Die sauberste Lösung
Aktualisieren :Wenn Sie .NET Core 2.1 oder höher (oder .NET Standard 2.1) verwenden, können Sie BinaryPrimitives.ReadUInt64BigEndian
das passt perfekt.
Auf .NET Framework ist hier die Lösung, die ich verwende:Timestamp.cs
. Im Grunde sobald Sie zu Timestamp gecastet haben , Sie können nichts falsch machen.