2009-10-02 64 views
0

我正在从一个程序,从串行端口读取二进制数据流,需要解析和格式化输入。需要帮助正则表达式分析器 - C#

数据不断读入,需要显示为完整字符串。每个字符串都有一个3字节的“开始代码”和一个3字节的“结束代码”。我需要编写一个解析器来查找基于开始和结束代码的数据 - 我假设一个正则表达式解析器是实现这一点的方法。

我读了一堆正则表达式在最后一天或两天,但它只是不点击。帮帮我?

开始代码:0x16 < 0×02(不会由空格隔开) 结束码:0×03> 0×17(不会由空格隔开)

任何人可以得到该正则表达式,将找到这些值?有没有一种方法可以在c#中找到它们,而不必将它们从字符串中移除(即不考虑它们中的正常分隔符,例如String.Split())?

回答

0

我认为正则表达式在这种情况下是矫枉过正的。我只是在数据字节到达时缓冲数据,在收到每个字节后,检查是否以您的结束代码结束。大约的东西像这样的(书面上的苍蝇,不只是贴&编译):

var buffer=new List<byte>(); 
var endCode=new byte[] {3, '>', 0x17}; 

// In a loop: 

byte? received=ReceiveByte(); //Return null if no new byte available 
if(byte.HasValue) { 
    buffer.Add(received); 
    if(buffer.Skip(buffer.Count()-endCode.Length).Take(endCode.Length).SequenceEqual(endCode){ 
    //Process the received data in buffer 
    buffer.Clear(); 
    } 
} 
+0

有一些修改,这个想法非常奏效。万分感谢。 – Slim 2009-10-09 14:58:42

1

如果它很简单匹配几个字节值,你可以看看写一个简单的有限状态机来匹配开始和结束。更容易测试和代表代码。

0

一个Regex.NET处理的Unicode字符串。当处理二进制数据字节时,Regex将需要某种形式的解码到Unicode。保存为字节数组的数据不适用于Regex的使用。要么找到一个有意义的(对于您的数据)Encoding,要么忘记正则表达式引擎。