Sí importa. Desea que su comparación tenga el mismo resultado que la comparación de SQL Server. SQL Server usa comparaciones sin firmar en tipos binarios:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
Si haces lo mismo con long que está firmado, 0xFFFFFFFFFFFFFFFF representa -1 . Eso significa que su comparación será incorrecta; no coincidirá con la misma comparación realizada en SQL Server.
Lo que definitivamente quieres es usar ulong donde 0xFFFFFFFFFFFFFFFF es ulong.MaxValue .
El endianismo también es importante
Además, como señaló Mark, BitConverter.GetUInt64 no está convirtiendo correctamente. Mark no tiene toda la razón - BitConverter es big-endian o little-endian según el sistema en el que se esté ejecutando. Puede ver esto por sí mismo
. Además, incluso si BitConverter siempre fue little-endian, Array.Reverse tiene menos rendimiento con una asignación de almacenamiento dinámico y una copia byte a byte. BitConverter simplemente no es semántica o prácticamente la herramienta adecuada para el trabajo.
Esto es lo que quieres:
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 solución más limpia
Actualizar :si usa .NET Core 2.1 o posterior (o .NET Standard 2.1), puede usar BinaryPrimitives.ReadUInt64BigEndian
que es un ajuste perfecto.
En .NET Framework, esta es la solución que uso:Timestamp.cs
. Básicamente, una vez que envías a Timestamp , no te puedes equivocar.