Byte-matcher
A simple module/function for finding binary matches in buffers. This function takes a buffer and a target buffer (or string converted to buffer) to match within the first buffer. Once all the bytes in the buffer have been interated an array of objects is returned containing a start index, end and/or a cursor value.
Install:
$ (sudo) npm install byte-matcher
Usage:
var byteMatcher = bufferToSearch = 'to find the thing' bufferToMatch = 'target to match' var matches =
The following attributes will only be present in the object if they have been established.
matches0start number|undefinedmatches0end number|undefinedmatches0cursor number|undefined
At this point I must point out the end value is actually the next index after the last index of that match - there is a good reason for this Say that you would like to slice a buffer:
var b = 'hello world!'// in order to get 'hello'// you must slice with the end index at the next bytevar hello = bconsole // === 'hello' even thoconsole // === 'o'
so if you want the actual last index matched byte you will need to do matches[0].end - 1
.
So if a match has been found and fully matched then it will have a start and an end. If a match has begun and the buffer has run out (suggesting the match could be split over multiple buffers) then the last match object in the array will have a start index and cursor signifying the next index of the target buffer, is intended to be used to check in a subsequent buffer.
The third argument will take a starting index (or cursor value) which the matching buffer can continue from.
This will yield a match with no start index value, and either an end index if the match is complete or a cursor value for the next buffer match to continue from.
This makes it particularly easy for juggling matches over a buffer boundaries because we will know that we have have started the match in this buffer if the match object has a startIndex and that the match is either complete with an end index or in progress with a cursor value.
If we have a match at the end of one buffer and then it is not fulfilled in a continuation it is safe to say that this was never matched.
Managing these indices is a little tricky but give a lot of power, this is intented to have other more user friendly modules built on top of it, such as binary matching streams.