Buffer 对象有 copy, slice, 但是没有 indexOf 方法,如果想在 Buffer 中搜索另一个Buffer(按字节序列)的位置有何高效方法?
发布于 13 年前 作者 myy 6317 次浏览 最后一次编辑是 8 年前

只能toString()吗 ?

3 回复

貌似也遇到类似的需求

/* Horspool 算法实现的快速子串匹配,这里用于在大Buffer中查找小Buffer src_buf =大Buffer, sub_buf=要找的小Buffer, start_index=起始位置,默认为0 */

function _BufferIndexOf(src_buf, sub_buf, start_index) { if(!Buffer.isBuffer(src_buf) || !Buffer.isBuffer(sub_buf)) return -1;
var src_len = src_buf.length, sub_len = sub_buf.length, idx = start_index-0;
if(isNaN(idx) || idx < 0) idx = 0; // default
if(src_len==0 || sub_len==0 || idx + sub_len > src_len) return -1;

// 如果只是查找单个字符 if(sub_len == 1) { for(var i = idx, c = sub_buf[0]; i<src_len; i++) if(src_buf[i] == c) return i; return -1; }

// 如果只是比较 src_buf 的尾部是否与 sub_buf 相等 if(idx + sub_len == src_len) { var i = idx + sub_len - 1; var j = sub_len - 1; for(; j>-1 && src_buf[i] == sub_buf[j]; j–, i-- ); return (j==-1) ? idx : -1; }

// Horspool 搜索算法 var skip = new Array(256); // 构造跳转表 for(var i=0; i< 256; i++) skip[i] = sub_len; for(var i=0; i< sub_len-1; i++) skip[ sub_buf[i] ] = sub_len - i - 1;

for(var k = idx + sub_len - 1; k < src_len; k += skip[ src_buf[k] ]) { var i = k; var j = sub_len - 1; for(; j>-1 && src_buf[i] == sub_buf[j]; j–, i–); // 回溯比较 if(j == -1) return i + 1; } return -1; }

您好,DeNA在招聘资深Node.js的职位,您有兴趣了解一下吗?

回到顶部