從varbinary
到bigint
(和後面)的鑄造使用網絡字節順序(big-endian)。 BitConverter
使用它運行的機器的endian-ness(x86和x64的little-endian)。
因此BitConverter.GetBytes
上-8588797048854775808(0x88CE7696E7167800)運行爲{0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77}和cast
在{0x00,0x88,0xE9,0x18,0x69,0x89,0x31, 0x77}是0x0088E91869893177 = 38536887891734903.
顯而易見的事情是,首先將64位整數存儲爲64位整數。
如果你真的需要做這種轉換,則:
var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))
會掉周圍的字節數,同時還便攜式的,如果一個big-endian的機器上運行它不會交換字節序。
另外,如果你不想使用System.Net命名空間出於某種原因,或者如果你想擴展到比三個IPAddress.HostToNetworkOrder
handeles其他類型,使用方法:
var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);
你爲什麼首先保存一個64位整數作爲varbinary? – BrokenGlass
通常情況下,您將在C#中將'long'作爲'bigint'存儲在SQL Server中。你有沒有特別的理由試圖將'long'存儲爲'varbinary'? – rsbarro
因爲該數據庫字段不僅包含int64類型的值。 – Maybe