Nó quan trọng. Bạn muốn so sánh của mình có cùng kết quả với so sánh của SQL Server. SQL Server sử dụng so sánh không dấu trên các kiểu nhị phân:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
Nếu bạn làm điều tương tự với long
được ký, 0xFFFFFFFFFFFFFFFF
đại diện cho -1
. Điều đó có nghĩa là so sánh của bạn sẽ không chính xác; nó sẽ không khớp với cùng một so sánh được thực hiện trong SQL Server.
Điều bạn chắc chắn muốn là sử dụng ulong
ở đâu 0xFFFFFFFFFFFFFFFF
là ulong.MaxValue
.
Sự bền bỉ cũng rất quan trọng
Ngoài ra, như Mark đã chỉ ra, BitConverter.GetUInt64
chuyển đổi không đúng cách. Đánh dấu là không hoàn toàn đúng - BitConverter
là big-endian hoặc little-endian tùy thuộc vào hệ thống mà nó đang chạy. Bạn có thể tự xem phần này
. Ngoài ra, ngay cả khi BitConverter luôn là phần tử nhỏ, Array.Reverse
kém hiệu quả hơn với phân bổ heap và sao chép từng byte. BitConverter
về mặt ngữ nghĩa hay thực tế không phải là công cụ phù hợp cho công việc.
Đây là những gì bạn muốn:
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];
}
Giải pháp sạch nhất
Cập nhật :Nếu bạn sử dụng .NET Core 2.1 trở lên (hoặc .NET Standard 2.1), bạn có thể sử dụng BinaryPrimitives.ReadUInt64BigEndian
đó là một sự phù hợp hoàn hảo.
Trên .NET Framework, đây là giải pháp tôi sử dụng: Timestamp.cs
. Về cơ bản khi bạn truyền đến Timestamp
, bạn không thể sai.