我正在构建一个客户端应用程序,需要以特定格式向服务器发送数据包,如果字节为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);
预期产出的例子
- input => 0x89,输出=> {0x38,0x39}
- input => 0xA3,输出=> {0x3A,0x33}
醇>
但是,如果我使用上面的代码,我得到以下输出
- input => 0x89,输出=> {0x38,0x39}
- input => 0xA3,输出=> {0x41,0x33}
醇>
答案 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),并打印成十进制,而不是十六进制。这不会发生在您发布的代码中,因此只需修改您的实际代码即可。