2014-09-23 87 views
1

我試圖使用Bitconverter類將byte array轉換爲hexadecimal值。使用C#中的BitConverter類將字節數組轉換爲十六進制值?

long hexValue = 0X780B13436587; 
byte[] byteArray = BitConverter.GetBytes (hexValue); 
string hexResult = BitConverter.ToString (byteArray); 

現在如果我執行由線上面的代碼行,這是我看到

enter image description here

我想hexResult的字符串將是相同hexValue(即780B13436587h),但我得到的是不同的,我錯過了什麼,糾正我,如果我錯了。

謝謝!

+1

「修復」是反轉你的字節數組(仔細看,你的結果是長反向的值)。原因是由於排序。 – vcsjones 2014-09-23 13:51:36

+0

非常好...感謝您將我喚醒......是否有任何方法可以恢復正確的訂單?我只是很想知道,爲什麼它會顛倒,有什麼理由? – SanVEE 2014-09-23 13:54:56

回答

5

Endianness。

BitConverter使用CPU-endianness,這對大多數人來說意味着:小端。 寫數字時,我們傾向於寫big-endian(廣義地說,你寫數千,數百,然後數十,然後是數字)。對於一個CPU,big-endian意味着最高有效字節是第一個而最低有效字節是最後一個。但是,除非您使用Itanium,否則您的CPU可能是小端,這意味着最重要的字節是,最後,最低有效字節是第一個。 CPU的實現使得這個不會影響,除非你正在偷看原始內存 - 它將確保數字和二進制算術仍然按照你期望的方式工作。然而,BitConverter工作偷看內存原始內存 - 因此你看到反轉的數據。

如果你想在big-endian格式的值,那麼你需要:

  • 以big-endian順序
  • 檢查BitConverter.IsLittleEndian值做手工,如果true
    • 任一反向輸入字節
    • 或反向輸出
+0

感謝您的澄清。 – SanVEE 2014-09-23 14:03:59

1

如果仔細觀察,BitConverter輸出中的字節會顛倒過來。

要獲得十六進制字符串的數字,您使用Convert類:

Convert.ToString(hexValue, 16); 
+0

謝謝,我知道使用Conver.Tostring(),但我試圖使用BitConverter類。 – SanVEE 2014-09-23 13:56:45

1

這是相同的號碼,但逆轉。 。 http://msdn.microsoft.com/en-us/library/3a733s97(v=vs.110).aspx

「的值的所有元素被轉換十六進制字符串的由ToString方法返回的順序取決於計算機體系結構是否爲小端:

BitConverter.ToString可以以相反的順序返回字符串表示或大端。「

+0

我想知道爲什麼該方法與其他方法具有相同的排序免責聲明。畢竟,這個方法只是接收一個字節數組 - 這個方法無關,無論字節是來自大端int還是小端int,還是其他東西。 – Rawling 2014-09-23 13:58:54

+1

@你瘋了,你是誤解;它完全是**按它們存在的順序處理字節。問題是,值爲0X780B13436587 **的'long'是**字節87 65 43 13 0B 78 00 00 - *正是因爲*您的CPU是小端。 – 2014-09-23 14:08:29

+1

@MarcGravell這正是我的觀點。這完全取決於您以前調用的'BitConverter.GetBytes()'方法*您擁有哪些字節 - 或者您可能在任意位置都有字節*。 'BitConverter.ToString'方法完全*不受它所運行系統字節序的影響。那麼爲什麼[它的MSDN文檔](http://msdn.microsoft.com/en-us/library/3a733s97%28v=vs.110%29.aspx)說*「由ToString方法返回的十六進制字符串的順序取決於計算機體系結構是小端還是大端。「*? – Rawling 2014-09-23 14:21:13

相關問題