从byte[]中提取特定数据。在线求助!急啊
有一个数组,长度不定。数组中内容如下格式
byte[] data = new byte[] { ......0xf2, 0x7d, 0xf2, 0x7d,1,2,3,4,5,6,7,8,9,0,......,0xeb, 0xb7, 0xeb, 0xb7,0xf2, 0x7d, 0xf2, 0x7d,32,23,43,54,......0xeb, 0xb7, 0xeb, 0xb7,0xf2, 0x7d, 0xf2, 0x7d,12,12,23,32,31,......};
其中data 的长度不固定,......表示不定长数据。
要求得到
夹在 0xf2, 0x7d, 0xf2, 0x7d,和0xeb, 0xb7, 0xeb, 0xb7
中间的所有数组
请大家给个思路
有高效源代码的俺使劲给分。
这个100分明显太少了,问题一旦解决,还可以另开一个加分贴。
------解决方案--------------------好久没做算法了,随手写一个。
List <byte[]> list = new List <byte[]> ();
int flag = 0;
int index = 0;
List <byte> section = new List <byte> ();
foreach ( byte b in data )
{
if ( b == (byte) 0xf2 && (flag == 0 || flag == 2) )
flag++;
else
flag = 0;
if ( b == (byte) 0x7d && (flag == 1 || flag == 3) )
flag++;
else
flag = 0;
if ( flag == 4 )
{
flag = 5;
continue;
}
if ( flag > 4 )
section.Add( byte );
if ( b == (byte) 0xeb && ( flag == 5 || flag == 7 )
flag++;
else
flag = 5;
if ( b == (byte) 0xb7 && ( flag == 6 || flag == 8 )
flag++;
else
flag = 5;
if ( flag == 9 )
{
section.RemoveRange( section.Lenth - 4, 4 );
list.Add( section.ToArray() );
}
}
------解决方案--------------------提供下我的思路
.0xf2, 0x7d, 0xf2, 0x7d是帧头,0xeb, 0xb7, 0xeb, 0xb7是帧尾
先匹配帧头 从帧头开始记录 直到碰到第一个帧尾 剪除固定长度的头帧尾 就得到要的数据了;
严格来说 帧头→帧尾才是一个有意义的信息段 帧头→帧头、帧尾 →帧尾 、帧尾→帧头都应该是丢失了帧 应该抛弃 具体要看你们的处理机制
性能 主要是在匹配的算法上 算法好 速度就快 帧头帧尾是固定长度 只要能快速匹配出有意义的信息段 减去固定的帧 就能得到数据。
关键还是匹配的算法上 可以多实验几种算法,看哪种方法快