两个ByteBuffer的匹配算法java实现,原作者 庄大侠,这边收藏下
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
/**
* @description
* @author <a href="junyu@taobao.com">junyu</a>
* @date 2012-9-7下午04:05:05
*/
public class ShiftAndByteBufferMatcher {
private int[] b;
private final int mask;
private final int patternLimit;
private final int patternPos;
private final int patternLen;
public ShiftAndByteBufferMatcher(final ByteBuffer pat) {
if (pat == null || pat.remaining() == 0) {
throw new IllegalArgumentException("blank buffer");
}
this.patternLimit = pat.limit();
this.patternPos = pat.position();
this.patternLen = pat.remaining();
this.preprocess(pat);
this.mask = 1 << this.patternLen - 1;
}
/**
* 预处理
*
* @param pat
*/
private void preprocess(final ByteBuffer pat) {
this.b = new int[256];
for (int i = this.patternPos; i < this.patternLimit; i++) {
final int p = (pat.get(i)) & 0xFF;
this.b[p] = this.b[p] | 1 << i;
}
}
public final List<Integer> matchAll(final ByteBuffer buffer) {
final List<Integer> matches = new ArrayList<Integer>();
final int bufferLimit = buffer.limit();
int d = 0;
for (int pos = buffer.position(); pos < bufferLimit; pos++) {
d <<= 1;
d |= 1;
d &= this.b[(buffer.get(pos)) & 0xFF];
if ((d & this.mask) != 0) {
matches.add(pos - this.patternLen + 1);
}
}
return matches;
}
public final int matchFirst(final ByteBuffer buffer) {
if (buffer == null) {
return -1;
}
final int bufferLimit = buffer.limit();
int d = 0;
for (int pos = buffer.position(); pos < bufferLimit; pos++) {
d <<= 1;
d |= 1;
d &= this.b[(buffer.get(pos)) & 0xFF];
if ((d & this.mask) != 0) {
return pos - this.patternLen + 1;
}
}
return -1;
}
}
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
/**
* @description
* @author <a href="junyu@taobao.com">junyu</a>
* @date 2012-9-7下午04:05:05
*/
public class ShiftOrByteBufferMatcher {
private int[] b;
private int lim;
private final int patternLen;
public ShiftOrByteBufferMatcher(final ByteBuffer pat) {
if (pat == null || pat.remaining() == 0) {
throw new IllegalArgumentException("blank buffer");
}
this.patternLen = pat.remaining();
this.preprocess(pat);
}
/**
* 预处理
*
* @param pat
*/
private void preprocess(final ByteBuffer pat) {
this.b = new int[256];
this.lim = 0;
for (int i = 0; i < 256; i++) {
this.b[i] = ~0;
}
for (int i = 0, j = 1; i < this.patternLen; i++, j <<= 1) {
this.b[(pat.get(i)) & 0xFF] &= ~j;
this.lim |= j;
}
this.lim = ~(this.lim >> 1);
}
public final List<Integer> matchAll(final ByteBuffer buffer) {
final List<Integer> matches = new ArrayList<Integer>();
final int bufferLimit = buffer.limit();
int state = ~0;
for (int pos = buffer.position(); pos < bufferLimit; pos++) {
state <<= 1;
state |= this.b[(buffer.get(pos)) & 0xFF];
if (state < this.lim) {
matches.add(pos - this.patternLen + 1);
}
}
return matches;
}
public final int matchFirst(final ByteBuffer buffer) {
if (buffer == null) {
return -1;
}
final int bufferLimit = buffer.limit();
int state = ~0;
for (int pos = buffer.position(); pos < bufferLimit; pos++) {
state = (state <<= 1) | this.b[(buffer.get(pos)) & 0xFF];
if (state < this.lim) {
return pos - this.patternLen + 1;
}
}
return -1;
}
}
分享到:
相关推荐
总的来说,Mina ByteBuffer是对Java NIO ByteBuffer的扩展和优化,它更加关注网络通信的性能和效率,提供了更适合网络服务开发的特性和功能。了解它们之间的差异对于高效利用Mina框架进行网络编程至关重要。通过阅读...
本教程重点讲解了`ByteBuffer`的几个关键属性:mark、position、limit和capacity,以及重要的操作方法如flip。这些概念和方法对于理解和使用Java NIO进行内存数据操作至关重要。 首先,`ByteBuffer`是`Buffer`接口...
总的来说,ByteBuffer是Android开发中处理二进制数据的强大工具,熟练掌握其用法和优化策略,可以显著提高应用程序的性能。在处理大量数据交换、网络通信和图像处理等场景时,合理使用ByteBuffer至关重要。
在IT行业中,ByteBuffer是一个非常重要的概念,特别是在网络通信和数据处理领域。ByteBuffer是Java平台提供的一种高效的数据操作接口,它允许我们以字节为单位进行读写操作,这对于处理二进制数据尤其有用。在...
ios-byteBuffer [![CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBuffer ) 用法 #分配 ByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian]; #输入数据 - ( ...
`ByteBuffer`会根据protobuf编码规则正确地读取和解析数据,包括`long`类型的字段。 在JavaScript中,`protobuf+long+bytebuffer`的组合使用可能涉及到以下步骤: 1. 定义protobuf消息格式(.proto文件)。 2. ...
`dena-bytebuffer`库就是为了解决这个问题而生,它提供了一个高效的方式来存储和操作二进制数据。本文将详细探讨`dena-bytebuffer`的核心特性、使用方法以及其在实际项目中的应用。 一、`dena-bytebuffer`简介 `...
本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...
jdk api-ServerSocketChannel、Selector、ByteBuffer结合实现网络报文间的通讯
7. **协议兼容性**:ByteBuffer的设计目的是为了方便处理各种网络协议,例如TCP/IP、HTTP等,它能帮助开发者轻松地构建协议解析器和构造器。 8. **优化的性能**:使用汇编语言实现的ByteBuffer,相比纯易语言版本,...
使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com
深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和联系 深入理解Apache_Mina_(5)----_配置Mina的线程模型 深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去...
JavaScript的ArrayBuffer / DataView的包装器,用于维护索引和默认字节序。 支持任意读取/写入,隐式增长,剪切,克隆和反转以及UTF-8字符和以NULL结尾的C字符串。 安装 ByteBuffer可通过: npm install byte-...
主要解决从流中获取数据,缓存,拆解,可用于TCP粘包问题
在Android开发中,JNI(Java Native Interface)允许Java代码与其他编程语言进行交互,尤其是在需要高效内存操作...理解并熟练运用ByteBuffer的创建、操作和JNI交互机制,对于优化Android系统的低层功能和性能至关重要。
在IT领域,ByteBuffer通常被用作一个高效的缓冲区,它可以存储和操作字节序列,尤其在处理网络通信时,能有效地组织和传输数据。易语言作为中国本土的一种编程语言,以其独特的“中文编程”特性,降低了编程的门槛,...
Scanner还支持使用正则表达式进行数据匹配和分割。 5. **十六进制表示**:在内存分析或调试过程中,有时需要将二进制数据以十六进制的形式展示。这个项目可能提供了一个方便的接口或方法,将ByteBuffer中的数据转化...
java api之ByteBuffer基础、应用场景、实战讲解 文档中有丰富的例子代码实现