解析十六进制传入/创建传出字符串

时间:2016-12-14 22:30:33

标签: c# parsing serial-port

我修改了一个例子来发送&从串口接收,并且工作正常。

我连接的设备有三个我需要使用的命令。 我的经验是C。

MAP - 返回field_names,(十进制)值列表& (十六进制)地址 我可以跟踪哪些值以十进制或十六进制形式返回。 每行以CR终止 :: 示例

会员:10 - (十进制)会员名称数量

NAME_LENGTH:每个名称字符串的 - (十进制)长度

NAME_BASE:0A34 - 10个(15)字符的c字符串,每个字符从地址(0x0A34)开始(每个空终结符后面可能有垃圾)

GET hexaddr hexbytecount - 返回从(hexaddr)开始的2字符十六进制值列表。

返回的字节是bytes / ints / long的混合,以及以CR终止的以null结尾的c字符串 :: 示例 ::

获取0a34 10 - 将返回

0A34< 54 65 73 74 20 4D 65 20 4F 75 74 00 40 D3 23 0B

这恰好是'测试我(00)其次是垃圾 等

PUT hexaddr hexbytevalue {{value ...} {value ...}} 发送多个十六进制字节值,以十六进制地址开头的空格分隔,以CR / LF结尾

这些字节是bytes / ints / long的混合,null终止c-strings :: 示例

把0a34 50 75 73 68 - (ascii Push)

将替换0x0A34的前4个字符变为' 推送我输出

SAVED OK

1 个答案:

答案 0 :(得分:0)

请参阅我之前关于串行处理的回答,这可能很有用Serial Port Polling and Data handling

将您的回复转换为实际文字: -

var s = "0A34 < 54 65 73 74 20 4D 65 20 4F 75 74 00 40 D3 23 0B";

var hex = s.Substring(s.IndexOf("<") + 1).Trim().Split(new char[] {' '});
var numbers = hex.Select(h => Convert.ToInt32(h, 16)).ToList();
var toText = String.Join("",numbers.TakeWhile(n => n!=0)
    .Select(n => Char.ConvertFromUtf32(n)).ToArray());
Console.WriteLine(toText);

enter image description here

其中: -   跳过字符串直到&lt;字符,然后将其余部分拆分为十六进制字符串

然后,将每个十六进制字符串转换为整数(基数为16)

然后,取每个数字直到找到0并将每个数字转换为文本(使用UTF32编码)

然后,我们将所有转换后的字符串连接在一起以重新创建原始文本

或者,更浓缩

var hex = s.Substring(s.IndexOf("<") + 1).Trim().Split(new char[] {' '});
var bytes = hex.Select(h => (byte) Convert.ToInt32(h, 16)).TakeWhile(n => n != 0);
var toText = Encoding.ASCII.GetString(bytes.ToArray());

从数字转换为十六进制: -

Console.WriteLine(123.ToString("X"));
Console.WriteLine(123.ToString("X4"));
Console.WriteLine(123.ToString("X8"));
Console.WriteLine(123.ToString("x4"));

enter image description here

你也会发现在https://msdn.microsoft.com/en-us/library/bb311038.aspx

中有很好的文档记录