C'est important. Vous voulez que votre comparaison ait le même résultat que la comparaison de SQL Server. SQL Server utilise des comparaisons non signées sur les types binaires :
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
Si vous faites la même chose avec long
qui est signé, 0xFFFFFFFFFFFFFFFF
représente -1
. Cela signifie que votre comparaison sera incorrecte ; il ne correspondra pas à la même comparaison effectuée dans SQL Server.
Ce que vous voulez vraiment, c'est utiliser ulong
où 0xFFFFFFFFFFFFFFFF
est ulong.MaxValue
.
L'endianité est également importante
De plus, comme Mark l'a souligné, BitConverter.GetUInt64
ne se convertit pas correctement. Mark n'a pas tout à fait raison - BitConverter
est soit big-endian ou little-endian selon le système sur lequel il s'exécute. Vous pouvez voir cela par vous-même
. De plus, même si BitConverter était toujours little-endian, Array.Reverse
est moins performant avec une allocation de tas et une copie octet par octet. BitConverter
n'est tout simplement pas sémantiquement ou pratiquement le bon outil pour le travail.
Voici ce que vous voulez :
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];
}
La solution la plus propre
Mettre à jour :Si vous utilisez .NET Core 2.1 ou version ultérieure (ou .NET Standard 2.1), vous pouvez utiliser BinaryPrimitives.ReadUInt64BigEndian
qui est un ajustement parfait.
Sur .NET Framework, voici la solution que j'utilise :Timestamp.cs
. Fondamentalement, une fois que vous avez casté vers Timestamp
, vous ne pouvez pas vous tromper.