⼀个困扰两天的问题:
需要通过串⼝向设备发送的数据:0A010 7e 08 00 11 00 00 7e 76 7f
我先将每个16进制字符转换成10进制,再将其转换成ASCII码对应的字符。
///<summary>
/// 16进制数组转ASCII字符串
///</summary>
///<param name="strArrHex"></param>
///<returns></returns>
publicstaticstring ConvertHexArrToString(string strHex)
{
StringBuilder sb = new StringBuilder();
string[] strArrHex = strHex.Split('');
foreach (string item in strArrHex)
{
//将⼗六进制转换成10进制
int ten = Convert.ToInt32(item, 16);
char cc = (char)ten;
sb.Append(cc);
}
string s = sb.ToString();
return s;
}
--------------------------------------------------------
View Code
这个没有问题,但是7e 08 00 22 00 01 01 74 f4 7f就有问题了
通过Wireshark抓包发现,只要包含a开头的⼗六进制数都变成了3f。
捣⿎两天查各种资料终于找到了问题的根源:合法的ASCII码只到0x7F,也就是说,⼤于0x7F的数你转成字符再发送的话,都会变成问号,也即0x3F。
找到问题了就好解决:不能将其转换成字符,⽽是把要发送的内容转换成16进制字节发送。
//在串⼝通讯过程中,经常要⽤到 16进制与字符串、字节数组之间的转换
publicstaticbyte[] HexStringToBytes(string hs)
{
string[] strArr = hs.Trim().Split('');
byte[] b = newbyte[strArr.Length];
//逐个字符变为16进制字节数据
for (int i = 0; i < strArr.Length; i++)
{
b[i] = Convert.ToByte(strArr[i], 16);
}
//按照指定编码将字节数组变为字符串
return b;
}
字符转换成16进制字节
要发送的数据“0A010 7e 08 00 22 00 01 01 74 f4 7f”
⾸先将0A010转换成16进制的ASCII码即30 41 30 31 00
然后将30 41 30 31 00 7e 08 00 22 00 01 01 74 f4 7f 通过HexStringToBytes⽅法转换成字节发送。
我考,终于搞定了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)