Det spelar roll. Du vill att din jämförelse ska få samma resultat som SQL Servers jämförelse. SQL Server använder osignerade jämförelser på binära typer:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
Om du gör samma sak med long
som är signerad, 0xFFFFFFFFFFFFFFFF
representerar -1
. Det betyder att din jämförelse blir felaktig; det kommer inte att matcha med samma jämförelse som gjorts i SQL Server.
Vad du definitivt vill är att använda ulong
där 0xFFFFFFFFFFFFFFFF
är ulong.MaxValue
.
Endianness är också viktigt
Dessutom, som Mark påpekade, BitConverter.GetUInt64
konverterar inte ordentligt. Mark har inte helt rätt - BitConverter
är antingen big-endian eller little-endian beroende på vilket system den körs på. Du kan se detta själv
. Också, även om BitConverter alltid var little-endian, Array.Reverse
är mindre presterande med en heap-allokering och byte-för-byte-kopiering. BitConverter
är helt enkelt inte semantiskt eller praktiskt det rätta verktyget för jobbet.
Det här är vad du vill:
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 renaste lösningen
Uppdatera :Om du använder .NET Core 2.1 eller senare (eller .NET Standard 2.1) kan du använda BinaryPrimitives.ReadUInt64BigEndian
vilket är en perfekt passform.
På .NET Framework, här är lösningen jag använder:Timestamp.cs
. I princip när du castar till Timestamp
, du kan inte gå fel.