Truyền từ varbinary
thành bigint
(và trở lại) sử dụng thứ tự byte mạng (big-endian). BitConverter
sử dụng endian-ness của máy mà nó được chạy (little-endian cho x86 và x64).
Do đó BitConverter.GetBytes
chạy trên -8588797048854775808 (0x88CE7696E7167800) là {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} và cast
trên {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} là 0x0088E91869893177 =38536887891734903.
Điều rõ ràng cần làm là chỉ lưu trữ số nguyên 64 bit dưới dạng số nguyên 64 bit ngay từ đầu.
Nếu bạn thực sự cần thực hiện chuyển đổi này thì:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
Sẽ hoán đổi xung quanh các byte, đồng thời có tính di động vì nó sẽ không hoán đổi các byte nếu chạy trên máy big-endian.
Ngoài ra, nếu bạn không muốn sử dụng không gian tên System.Net vì lý do nào đó hoặc nếu bạn muốn có thể mở rộng sang các loại khác với ba IPAddress.HostToNetworkOrder
handeles, sử dụng:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);