首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何分割一个大的ByteBuffer? [已结贴,结贴人:BatiTan]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BatiTan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-21 15:54:04 楼主
    如果有一个很大的ByteBuffer,比如1024个.
    这个ByteBuffer是由格式相同的数据帧组成
    每个数据帧都由一个相同的尾部标志着数据帧的结束
    现在假设这个尾部为连续的4个字节,56, 57, 58, 59
    则如何根据这个尾部分割这个大的ByteBuffer?
    希望尽量运行效率较高.
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • preferme
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 12:19:091楼 得分:5
    模式匹配效率可能要高一些。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BatiTan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 15:03:432楼 得分:0
    正则表达式也可以用在ByteBuffer上吗?
    不都是用在String类型上的嘛.能否举个例子
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

      8

    发表于:2008-08-24 17:52:123楼 得分:5
    无他,唯遍历尔。
    你在生成时,为何不进行分割呢?既然已经一次性读取进来了,只能遍历了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guoxujie
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 09:54:244楼 得分:5
    引用 3 楼 java2000_net 的回复:
    无他,唯遍历尔。
    你在生成时,为何不进行分割呢?既然已经一次性读取进来了,只能遍历了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chaorenwopashei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 13:44:375楼 得分:5
    但是便利以后要迭代,要么就出现数据丢失了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • preferme
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-26 12:27:266楼 得分:0
    /**
    *
    */
    package houlei.nio;

    import java.nio.ByteBuffer;
    import java.util.ArrayList;

    /**
    * 该类的方法不是线程安全的。主要功能是对一个ByteBuffer对象进行匹配、分割。
    *
    * 该类创建于 2008-8-26 下午12:19:06
    * @version 1.0.0
    * @author 侯磊
    */
    public class ByteBufferUtil {
    /**
    * 使用KMP算法进行模式匹配,分割一个大的ByteBuffer
    */
    public static ByteBuffer [] split(ByteBuffer buf, byte[] separator){
    int next [] = next(separator);
    int index=index_KMP(buf,separator,next);
    if(index==-1)return null;
    ArrayList <ByteBuffer> list = new ArrayList <ByteBuffer>();
    do{
    byte bs [] = new byte[index-buf.position()];
    buf.get(bs);
    for(int i=0;i <separator.length;i++)buf.get();
    list.add(ByteBuffer.wrap(bs));
    }while((index=index_KMP(buf, separator, next))!=-1);
    if(buf.position() <buf.limit()){
    byte bs [] = new byte[buf.limit()-buf.position()];
    buf.get(bs);
    list.add(ByteBuffer.wrap(bs));
    }
    ByteBuffer bbs[] = new ByteBuffer[list.size()];
    list.toArray(bbs);
    return bbs;
    }
    /**
    * 该方法使用KMP算法进行模式匹配
    */
    public static int index(ByteBuffer buf,byte [] separator){
    return index_KMP(buf,separator,next(separator));
    }
    private static int [] next(byte [] pattern){
    int next []  = new int[pattern.length];
    next[0]=-1;
    int k=-1,j=0;
    while(j <pattern.length) {
    if(k!= -1 && pattern[k]!= pattern[j] )
    k=next[k];
    ++j;++k;
    if(j <pattern.length)break;
    if(pattern[k]== pattern[j])
    next[j]=next[k];
    else
    next[j]=k;
    }
    return next;
    }
    private static int index_KMP(ByteBuffer buf,byte [] pattern,int next []){
    if(buf==null || pattern==null || next==null
    || buf.hasRemaining()==false ||pattern.length ==0 || next.length==0)
    return -1;
    int index=0,i=buf.position(),j=0,limit=buf.limit();
    while(i <limit && j <pattern.length)
    {
    if(buf.get(i)== pattern[j])
    {
    ++i;// 继续比较后继字符
    ++j;
    }
    else
    {
    index += j-next[j];
    if(next[j]!=-1)
    j=next[j];// 模式串向右移动
    else
    {
    j=0;
    ++i;
    }
    }
    }//while
    if(j>=pattern.length)
    return index+buf.position();// 匹配成功
    else
    return -1;   
    }
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • preferme
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-26 12:28:407楼 得分:30
    重新提交一下。LZ使用split方法就可以了。
    Java code
    /** * */ package houlei.nio; import java.nio.ByteBuffer; import java.util.ArrayList; /** * 该类的方法不是线程安全的。主要功能是对一个ByteBuffer对象进行匹配、分割。 * * 该类创建于 2008-8-26 下午12:19:06 * @version 1.0.0 * @author 侯磊 */ public class ByteBufferUtil { /** * 使用KMP算法进行模式匹配,分割一个大的ByteBuffer */ public static ByteBuffer [] split(ByteBuffer buf, byte[] separator){ int next [] = next(separator); int index=index_KMP(buf,separator,next); if(index==-1)return null; ArrayList<ByteBuffer> list = new ArrayList<ByteBuffer>(); do{ byte bs [] = new byte[index-buf.position()]; buf.get(bs); for(int i=0;i<separator.length;i++)buf.get(); list.add(ByteBuffer.wrap(bs)); }while((index=index_KMP(buf, separator, next))!=-1); if(buf.position()<buf.limit()){ byte bs [] = new byte[buf.limit()-buf.position()]; buf.get(bs); list.add(ByteBuffer.wrap(bs)); } ByteBuffer bbs[] = new ByteBuffer[list.size()]; list.toArray(bbs); return bbs; } /** * 该方法使用KMP算法进行模式匹配 */ public static int index(ByteBuffer buf,byte [] separator){ return index_KMP(buf,separator,next(separator)); } private static int [] next(byte [] pattern){ int next [] = new int[pattern.length]; next[0]=-1; int k=-1,j=0; while(j<pattern.length) { if(k!= -1 && pattern[k]!= pattern[j] ) k=next[k]; ++j;++k; if(j<pattern.length)break; if(pattern[k]== pattern[j]) next[j]=next[k]; else next[j]=k; } return next; } private static int index_KMP(ByteBuffer buf,byte [] pattern,int next []){ if(buf==null || pattern==null || next==null || buf.hasRemaining()==false ||pattern.length ==0 || next.length==0) return -1; int index=0,i=buf.position(),j=0,limit=buf.limit(); while(i<limit && j<pattern.length) { if(buf.get(i)== pattern[j]) { ++i;// 继续比较后继字符 ++j; } else { index += j-next[j]; if(next[j]!=-1) j=next[j];// 模式串向右移动 else { j=0; ++i; } } }//while if(j>=pattern.length) return index+buf.position();// 匹配成功 else return -1; } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BatiTan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-26 17:49:458楼 得分:0
    非常感谢preferme使用KMP算法解决
    也感谢其他人的热心和帮助...谢谢~...!!
    以前虽然看过算法,但平时好象基本上没有用
    通过这个帖子,让我知道了算法的使用~以后还要多多学习
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved