2016-05-05 151 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

似乎它被搞砸后..谢谢你的回应 –

相关问题