将十六进制字符串字节转换为字节数组

时间:2016-05-05 05:30:27

标签: c#

我正在构建一个客户端应用程序,需要以特定格式向服务器发送数据包,如果字节为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. input => 0x89,输出=> {0x38,0x39}
  2.   
  3. input => 0xA3,输出=> {0x3A,0x33}
  4.   

但是,如果我使用上面的代码,我得到以下输出

  
      
  1. input => 0x89,输出=> {0x38,0x39}
  2.   
  3. input => 0xA3,输出=> {0x41,0x33}
  4.   

1 个答案:

答案 0 :(得分: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),并打印成十进制,而不是十六进制。这不会发生在您发布的代码中,因此只需修改您的实际代码即可。