C#发送16进制串⼝数据
⼀个困扰两天的问题:
需要通过串⼝向设备发送的数据:0A010 7e 08 00 11 00 00 7e 76 7f
我先将每个16进制字符转换成10进制,再将其转换成ASCII码对应的字符。
///<summary>
/// 16进制数组转ASCII字符串
///</summary>
///<param name="strArrHex"></param>
///<returns></returns>
public static string 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进制与字符串、字节数组之间的转换
public static byte[] HexStringToBytes(string hs)
{
string[] strArr = hs.Trim().Split('');
byte[] b = new byte[strArr.Length];
//逐个字符变为16进制字节数据
for (int i = 0; i < strArr.Length; i++)
字符串数组怎么转成byte{
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⽅法转换成字节发送。
我考,终于搞定了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论