只能toString()吗 ?
/* 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; }