搜索
bottom↓
回复: 13

C#如何利用正则表达式解析字符串为HEX格式(字节)

[复制链接]

出590入992汤圆

发表于 2019-11-21 11:24:15 | 显示全部楼层 |阅读模式
本帖最后由 SUPER_CRJ 于 2019-11-21 11:26 编辑

现在正在做一个串口应用,把文本框中的数据提取出来,然后按照字节发送出去,之前使用的方法比较死板(遍历和判断),现在想升级方法,正好看到正则表达式可能满足要求,但是本人不是太明白!

已知:文件框中只会有:HEX格式字符和空格
但是会有下面组合(因为不好让客户按照:xx xx xx 来写)
例如:
1:标准格式:比如 01 23 45 67 08 ,这个时候按照顺序解析:0x01 0x23 0x45 0x67 0x08
2:没有空格,比如: 012345678
3:把0去掉的空格:1 23 45 67 8,
4:有的加空格,有的不加:1 234567 8,显然:其中的234567,要解析为:0x23 0x45 0x67


现在的问题是,在网卡搜索的正则匹配:
1:\b[\da-fA-F]{2}   只能解析其中长度为2的字符串。也就是:只能解析上述例子的2正确。
2:\b[0-9a-fA-F]+\b   会解析超出字节的范围,比如11A,我实际是想解析为:0x11 0xA,但是这个解析为:0x11A。


现在想的方法:要是能处理下字符串,把长度大于2的给截断。不过又回到死板的方法,要遍历和判断空格。

求教有没有好的方法!本人C#比较菜,正则表达式都是搜索的,不是很理解

附上当前解析的代码
  1. MatchCollection mc = Regex.Matches(txb_send.Text.ToString(), @"\b[0-9a-fA-F]+\b");

  2.             List<byte> buf = new List<byte>();
  3.             foreach(Match m in mc)
  4.             {
  5.                 buf.Add( byte.Parse(m.Value,System.Globalization.NumberStyles.HexNumber) );
  6.             }
  7.             serialPort1.Write(buf.ToArray(), 0, buf.Count);
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入22汤圆

发表于 2019-11-21 11:30:10 | 显示全部楼层
c#可以一句话把空格去掉,所以全部进来的数据先全部去掉空格然后不是偶数的就提示错误输入,偶数的就是2个两个处理

出590入992汤圆

 楼主| 发表于 2019-11-21 11:36:24 | 显示全部楼层
jiaowoxiaolu 发表于 2019-11-21 11:30
c#可以一句话把空格去掉,所以全部进来的数据先全部去掉空格然后不是偶数的就提示错误输入,偶数的就是2个 ...

但是如何文本框中为: 1 2 3 ,按照用户角度是:0x01 0x02 0x03,本身空格是分割表示的,如果去掉空格,不仅是奇数,同时也合并了两个不应该合并的数

出590入992汤圆

 楼主| 发表于 2019-11-21 11:39:14 | 显示全部楼层
jiaowoxiaolu 发表于 2019-11-21 11:30
c#可以一句话把空格去掉,所以全部进来的数据先全部去掉空格然后不是偶数的就提示错误输入,偶数的就是2个 ...

实际中,也有遇到用户要求用换行符分割的,说是数据比较好看。(其实要求一定要按照 xx xx来写也不是不可以。)
55
22
BB CC
03

出0入22汤圆

发表于 2019-11-21 11:39:23 | 显示全部楼层
SUPER_CRJ 发表于 2019-11-21 11:36
但是如何文本框中为: 1 2 3 ,按照用户角度是:0x01 0x02 0x03,本身空格是分割表示的,如果去掉空格, ...

强制要求输入0啊,要不然没法区别,1123456你到底是01 12 03 45 06还是11 23 45 06 ??

出590入992汤圆

 楼主| 发表于 2019-11-21 11:45:00 | 显示全部楼层
本帖最后由 SUPER_CRJ 于 2019-11-21 11:46 编辑
jiaowoxiaolu 发表于 2019-11-21 11:39
强制要求输入0啊,要不然没法区别,1123456你到底是01 12 03 45 06还是11 23 45 06 ?? ...


也可以,那知道:012344,怎么用正则表达式,解析出:01 23 44吗?我现在用的,会把解析出:0x12344(超过字节了!)
不过没有解决一个问题,就是空格是不能去掉的。因为:1 2 3 4,强制用户写成:01 02 03 04,个人觉得还是不太合适(不过我用的:sscom,刚刚试了下:1 2 3 4,是解析为:0x12 0x34的)。

出0入0汤圆

发表于 2019-11-21 12:05:45 | 显示全部楼层
我觉得还是把任务划分成几个步骤来做比较好,不要想一个语句全搞定,太复杂了

1. 把数字画分为2个一组,空格分开  \d
2. 单个数字前面补0
3. 加上0X

出0入0汤圆

发表于 2019-11-21 14:19:23 | 显示全部楼层
dragonbbc 发表于 2019-11-21 12:05
我觉得还是把任务划分成几个步骤来做比较好,不要想一个语句全搞定,太复杂了

1. 把数字画分为2个一组,空 ...

不好意思,看错了,原来楼主并不需要把单个字符补0,那这样好办

一句话虽然能搞定,但是这样会有个后遗症,原先有空格的后面还是会再加上一个空格,没想到有效的解决办法,或者后面再来一步,把多余空格合并

PS:语法是UE语法,C#中可能会有差异

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-11-21 14:28:20 | 显示全部楼层
感觉兼容多种输入文件格式不好做

出10入0汤圆

发表于 2019-11-21 14:32:08 来自手机 | 显示全部楼层
我觉得楼主想要的这个文法本身就是存在二义性的。

出590入992汤圆

 楼主| 发表于 2019-11-21 16:25:54 | 显示全部楼层
dragonbbc 发表于 2019-11-21 14:19
不好意思,看错了,原来楼主并不需要把单个字符补0,那这样好办

一句话虽然能搞定,但是这样会有个后遗 ...

谢谢,是我想要的。这样可以先替换,然后再进行转换。
不过,我刚刚在C#试了下,替换的不对。今晚回去查找下原因!

出0入0汤圆

发表于 2019-11-21 18:42:13 | 显示全部楼层
SUPER_CRJ 发表于 2019-11-21 16:25
谢谢,是我想要的。这样可以先替换,然后再进行转换。
不过,我刚刚在C#试了下,替换的不对。今晚回去查 ...

替换为的字符串后面有个空格,也就是"0x\1 "

出590入992汤圆

 楼主| 发表于 2019-11-22 16:50:46 | 显示全部楼层
dragonbbc 发表于 2019-11-21 14:19
不好意思,看错了,原来楼主并不需要把单个字符补0,那这样好办

一句话虽然能搞定,但是这样会有个后遗 ...

谢谢。今天试了,满足我的要求。之前的代码太长了,纯粹就和写单片机一样。
这个代码节省了好多。
最后:用下面这个插入替换字符,再做解析!非常好用。
  1. Regex.Replace(txb_send.Text,@"((\d\s)|(\d\d))(\s*)", "$0" + " ");
复制代码

出0入36汤圆

发表于 2019-11-22 17:02:30 | 显示全部楼层
不用那么麻烦 只要用tostring("X2")就可以把byte转成十六进制字符串
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 19:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表