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);