2016-05-05 153 views
0

我建立這需要發送分組到服務器以特定格式的客戶端應用,使得如果該字節是0xA3執行,服務器期望它爲{0x3A,0x33}轉換十六進制字符串字節到字節數組

我早些時候使用了下面的方法。如果該字節是例如0x89,則它工作良好。但是,如果該字節是0xA3執行它不工作預期輸出的

string hex = hexStr .Length == 1 ? "0" + hexStr:hexStr ; 
byte packet1 = (byte)(int.Parse(hex[0].ToString(), System.Globalization.NumberStyles.HexNumber) + 0x30); 
byte packet2 = (byte)(int.Parse(hex[1].ToString(), System.Globalization.NumberStyles.HexNumber) + 0x30); 

實例

  1. 輸入=> 0x89上,輸出=> {0x38,0x39}
  2. 輸入=> 0xA3執行,輸出=> {0x3A,0x33}

然而如果我使用上面的代碼我得到以下輸出

  1. 輸入=> 0x89上,輸出=> {0x38,0x39}
  2. 輸入=> 0xA3執行,輸出=> {的0x41,0x33}
+0

它*實際*總是以「0x」開始?如果是這樣,當然你可以拋棄你的第一部分。如果不是,你真的需要告訴我們這些案件是什麼。現在,您似乎試圖從這些數據中獲取兩個字節 - 但兩個十六進制數字代表一個字節。只要使用'byte.Parse' ...如果它不起作用,請告訴我們哪些情況下它不起作用... –

+0

@JonSkeet我編輯了我的問題。要求是我應該從hexStr形成一個字節數組,這樣每個半字節在數組中表示爲一個單獨的字節 –

+1

哇,這在*之前並不明顯......它仍然不清楚爲什麼有一個加法0x30在每種情況下......爲什麼不是你的半字節0xA,0x6?你們還沒有給我們一個什麼也行不通的例子。 –

回答

1

的問題是不在你顯示的代碼中。

你需要做的十六進制所有的數學,並轉換爲字符串(如果需要)爲十六進制還有:

string hex = "A3"; 
byte packet1 = (byte)(int.Parse(hex[0].ToString(), NumberStyles.HexNumber) + 0x30); 
byte packet2 = (byte)(int.Parse(hex[1].ToString(), NumberStyles.HexNumber) + 0x30); 

Console.WriteLine("{0:X2}, {1:X2}", packet1, packet2); // 3A, 33 

工程完全按照你的期望。

您得到的結果似乎表明您拍下了30(十進制),並添加了0xA(11),並打印爲十進制而不是十六進制。這不會發生在您發佈的代碼中,因此只需修復您的實際代碼即可。

+0

似乎它被搞砸後..謝謝你的迴應 –

相關問題