2016-08-01 34 views
0

我有十六进制数据从串行设备发出的数据流,格式如下:拆分流十六进制字符串成小块

F4 01 09 05 05 F4 01 09 05 05 F4 F 01 09 05 05 F4 01 09 05 05 

我需要做的(在C#)读取输入字符串,并按'F4'分成块,以便处理。所以,我得到:

string DataToProcess = "F4 01 09 05 05"; 

的更新,因为每个部分进来

我有点坚持以接近这一点的最好办法。

我:

byte[] data = new byte[count]; 
_serialPort.Read(data, 0, data.Length); 

string rawString = BitConverter.ToString(data, 0); 

if (rawString.Contains("F4")) 
{ 
    //split here?      
} 

由于是现场直播,在count变量总是在变化。我怎样才能'等'F4,并从一个部分创建一个子串?

谢谢。

+0

就是 “F4” 子总是相同的长度或执行从一个F4到另一个va的字节数还有吗? –

+0

它是相同的长度。但是这个流可能不是从F4开始的。 – anti

+0

我假设数据正在一个循环内被读取。下一次迭代从前一次结束的地方开始。因此,Read函数返回读取的字节数,它可以告诉您有多少个子字符串,其余字节(小于F4子字符串的长度)应该保存并添加到数据数组的开头下一次迭代。 –

回答

1

您可以使用string.Split(string[], StringSplitOptions)混合LINQ每个F4分裂:

if (rawString.Contains("F4")) 
{ 
    string[] dataToProcess = rawString.Split(new string[] { "F4" }, StringSplitOptions.None).Select(l => "F4" + l).ToArray(); 
} 
+0

嗨,谢谢!这给了我一个错误: '错误\t CS0266 \t不能隐式地将类型System.Collections.Generic.IEnumerable 转换为字符串[]。存在明确的转换(您是否缺少演员?)' – anti

+1

对不起,我忘了添加'.ToArray()',修正了问题。 – 2016-08-01 09:26:11

1

使用固定大小的缓冲区和分析数据,它有喜欢的东西:

byte[] buffer = new byte[2048]; 
while (_serialPort.Read(data, 0, data.Length) > 0) { 
    String rawString = Encoding.ASCII.GetString(buffer); 
    String[] splitted = rawString.Split("\u00F4"); 
    // work with splitted 
} 

注意上面的例子使用ASCII解码而不是BitConverter.ToString。如果您需要使用字节,请首先将其转换为String?您也可以使用字节,C#支持类似0xF4的语法,它将表示十六进制格式的数字。

2

我建议分组data无需转换数组转换为字符串

byte[] data = new byte[] { 
    0xF4, 0x01, 0x09, 0x05, 0x05, ..., 0x09, 0x05, 0x05 }; 

// Using side effect in not the best practice, but helpful 
int group = 0; 

var result = data 
    .GroupBy(item => item == 0xF4 ? ++group : group) 
    .Select(chunk => chunk.ToArray()); 
//.ToArray(); // <- if you want to materialize 

测试

string report = string.Join(Environment.NewLine, result 
    .Select(array => string.Join(", ", array 
    .Select(item => item.ToString("X2"))))); 

Console.Write(report); 

成果

F4, 01, 09, 05, 05 
F4, 01, 09, 05, 05 
F4, 0F, 01, 09, 05, 05 
F4, 01, 09, 05, 05 
+0

谢谢!这似乎给了我不同的结果。有时候只有一半,有时甚至更多...... '报告=“F4,01,09,01,05,00,02,如图1C所示,A0,06,00,03,A3,40,07,00,05,29,E0,01,00,00, 11,20,02,00,00,0,08,13,00,00,18,F0,0C, 5C,7F,00 \ r \ NF4,01,09,02,05,00,02,1D,04,06,00,03,A3,A3' – anti

+0

@anti:如果有错误/非预期的结果,请提供一个*计数器的例子*,即'data = new byte [] {....};' –

+0

抱歉!请看下面的内容:'count'的值随着数据的读取而改变,我应该等待一个certian号码?字节(流是作为活我连接,所以在一个'F4'不能开始 – anti

相关问题