日期:2014-05-19  浏览次数:21542 次

从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是帧尾
先匹配帧头 从帧头开始记录 直到碰到第一个帧尾 剪除固定长度的头帧尾 就得到要的数据了;

严格来说 帧头→帧尾才是一个有意义的信息段 帧头→帧头、帧尾 →帧尾 、帧尾→帧头都应该是丢失了帧 应该抛弃 具体要看你们的处理机制


性能 主要是在匹配的算法上 算法好 速度就快 帧头帧尾是固定长度 只要能快速匹配出有意义的信息段 减去固定的帧 就能得到数据。
关键还是匹配的算法上 可以多实验几种算法,看哪种方法快