`
BucketLi
  • 浏览: 195205 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5674
社区版块
存档分类
最新评论

Shift-And和Shift-Or ByteBuffer匹配器

 
阅读更多
两个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;
	}
}
分享到:
评论

相关推荐

    深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

    总的来说,Mina ByteBuffer是对Java NIO ByteBuffer的扩展和优化,它更加关注网络通信的性能和效率,提供了更适合网络服务开发的特性和功能。了解它们之间的差异对于高效利用Mina框架进行网络编程至关重要。通过阅读...

    【IT十八掌徐培成】Java基础第26天-05.ByteBuffer-mark-pos-limit-cap-flip.zip

    本教程重点讲解了`ByteBuffer`的几个关键属性:mark、position、limit和capacity,以及重要的操作方法如flip。这些概念和方法对于理解和使用Java NIO进行内存数据操作至关重要。 首先,`ByteBuffer`是`Buffer`接口...

    Android中的ByteBuffer解析

    总的来说,ByteBuffer是Android开发中处理二进制数据的强大工具,熟练掌握其用法和优化策略,可以显著提高应用程序的性能。在处理大量数据交换、网络通信和图像处理等场景时,合理使用ByteBuffer至关重要。

    ByteBuffer.zip

    在IT行业中,ByteBuffer是一个非常重要的概念,特别是在网络通信和数据处理领域。ByteBuffer是Java平台提供的一种高效的数据操作接口,它允许我们以字节为单位进行读写操作,这对于处理二进制数据尤其有用。在...

    ios-byteBuffer:在objective-c中重写一个类

    ios-byteBuffer [![CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBuffer ) 用法 #分配 ByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian]; #输入数据 - ( ...

    protobuf+long+bytebuffer

    `ByteBuffer`会根据protobuf编码规则正确地读取和解析数据,包括`long`类型的字段。 在JavaScript中,`protobuf+long+bytebuffer`的组合使用可能涉及到以下步骤: 1. 定义protobuf消息格式(.proto文件)。 2. ...

    dena-bytebuffer:dena-bytebuffer

    `dena-bytebuffer`库就是为了解决这个问题而生,它提供了一个高效的方式来存储和操作二进制数据。本文将详细探讨`dena-bytebuffer`的核心特性、使用方法以及其在实际项目中的应用。 一、`dena-bytebuffer`简介 `...

    Java NIO学习笔记——ByteBuffer用法

    本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...

    jdk api-ServerSocketChannel、Selector、ByteBuffer结合实现网络报文间的通讯

    jdk api-ServerSocketChannel、Selector、ByteBuffer结合实现网络报文间的通讯

    易语言-易语言汇编版ByteBuffer

    7. **协议兼容性**:ByteBuffer的设计目的是为了方便处理各种网络协议,例如TCP/IP、HTTP等,它能帮助开发者轻松地构建协议解析器和构造器。 8. **优化的性能**:使用汇编语言实现的ByteBuffer,相比纯易语言版本,...

    NIO(byteBuffer)按行读取文件

    使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com

    关于apache Mina Server

    深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和联系 深入理解Apache_Mina_(5)----_配置Mina的线程模型 深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去...

    byte-buffer:JavaScript的ArrayBufferDataView的包装器可简化读写操作

    JavaScript的ArrayBuffer / DataView的包装器,用于维护索引和默认字节序。 支持任意读取/写入,隐式增长,剪切,克隆和反转以及UTF-8字符和以NULL结尾的C字符串。 安装 ByteBuffer可通过: npm install byte-...

    ByteBuffer.cs

    主要解决从流中获取数据,缓存,拆解,可用于TCP粘包问题

    Android在JNI中使用ByteBuffer的方法

    在Android开发中,JNI(Java Native Interface)允许Java代码与其他编程语言进行交互,尤其是在需要高效内存操作...理解并熟练运用ByteBuffer的创建、操作和JNI交互机制,对于优化Android系统的低层功能和性能至关重要。

    易语言汇编版ByteBuffer源码

    在IT领域,ByteBuffer通常被用作一个高效的缓冲区,它可以存储和操作字节序列,尤其在处理网络通信时,能有效地组织和传输数据。易语言作为中国本土的一种编程语言,以其独特的“中文编程”特性,降低了编程的门槛,...

    ByteBuffer-scanner-Memor-Hex:出色地

    Scanner还支持使用正则表达式进行数据匹配和分割。 5. **十六进制表示**:在内存分析或调试过程中,有时需要将二进制数据以十六进制的形式展示。这个项目可能提供了一个方便的接口或方法,将ByteBuffer中的数据转化...

    java api之ByteBuffer基础、应用场景、实战讲解

    java api之ByteBuffer基础、应用场景、实战讲解 文档中有丰富的例子代码实现

Global site tag (gtag.js) - Google Analytics