节点的字节匹配 。 联合来文
给出一个用于解析和构建字节缓冲的紧凑语法, 来源于 Erlang的一点 语法。 。 。 .
var bitsyntax = require('bitsyntax');
var pattern = bitsyntax.matcher('len:8/integer, str:len/binary');
var bound = pattern(new Buffer([4, 0x41, 0x42, 0x43, 0x44]));
bound.str
// => <Buffer 41 42 43 44>
一个典型的用法是解析插座的字节流 。 对于 示例,大小前缀框架 :
var framePattern = bitsyntax.matcher('len:32/integer, frame:len/binary, rest/binary');
socket.on('data', function process(data) {
var m;
if (m = framePattern(data)) {
emit('frame', m.frame);
process(m.rest);
}
else {
stashForNextData(data);
}
});
模式也可以用来从供应中构建字节缓冲 值 :
var spdyDataFrame = require('bitsyntax')
.builder('streamId:32, flags:8, length:24, data/binary');
spdyDataFrame({streamId:5, flags:0, length:bin.length, data:bin});
一种模式的一个或多个部分也可以多种形式提供 参数,如果这样做更方便的话;这样就更容易拆分 长线图案 :
var p = bitsyntax.matcher('size:8, payload:size/binary',
'rest/binary');
API 密码
matcher
将图案编译为字符串( 或字符串), 到一个会
返回装订地图,或 false,以缓冲和
可选择的环境。 环境包含约束值
图案中的变量(如果有的话).
var p = bitsyntax.matcher('header:headerSize/binary, rest/binary');
var b = p(new Buffer([1, 2, 3, 4, 5]), {headerSize: 3});
b.header
// => <Buffer 01 02 03>
火柴会回来的 false 如果提供的缓冲不匹配
模式;例如,如果字节太少,或字节不是
现相.
var p = bitsyntax.matcher('"foo=", str/binary');
p(new Buffer("bar=humbug"));
// => false
parse 财务报告和审定财务报表 match
组成时,相当于 matcher; 如果想要, 可能有用
考察图案的内部结构.
parse 字符串为 matcher,然后返回内部
说明模式. match 接受这一代表,a
缓冲和可选的环境,并返回绑定值或
false (如: matcher) (中文(简体) ).
var p = bitsyntax.parse('header:headerSize/binary',
'rest/binary');
var b = bitsyntax.match(p, new Buffer([1, 2, 3, 4, 5]),
{headerSize: 3});
b.header
// => <Buffer 01 02 03>
builder
使用模式并返回将构建字节的函数 缓冲,为模式中提及的变量设定值.
var cons = bitsyntax.builder('size:8, bin/binary');
cons({size:6, bin:new Buffer('foobar')});
// => <Buffer 06 66 6f 6f 62 61 72>
提供给构建者的模式与模式略有不同 为匹配而提供,见下文.
build
使用解析的图案和可变值地图,然后返回 a
缓冲。 一样 match,可能对调试模式有用.
var pattern = bitsyntax.parse('size:8, bin:size/binary');
bitsyntax.build(pattern, {size:6, bin: new Buffer('foobar')});
// => <Buffer 06 66 6f 6f 62 61 72>
write
根据 给出解析模式 。 返回完成偏移, 即已提供 页:1.
var pattern = bitsyntax.parse('size:8, bin/binary');
var buf = new Buffer(7);
bitsyntax.write(buf, 0, pattern,
{size:6, bin: new Buffer('foobar')});
// => 7
buf
// => <Buffer 06 66 6f 6f 62 61 72>
模式
图案是片段的序列,每个片段匹配一个值. 部分 有一般形式
value:size/type_specifier_list
大小和类型规格列表可省略,另加三个 变量 :
value
value:size
value/type_specifier_list
类型区分符列表是一个关键词列表,由 连字. 类型描述如下.
图案一般作为字符串提供,以逗号分隔 系列片段.
变量或数值
片段的第一部分给出了可变名称或文字 数值。 如果给出了一个可变名称, 与段匹配的值 将被绑定在图案的其余部分的可变名称上。 如果有的话 给出字面值,匹配值必须等同该值。 如果有的话 变量的值在环境中给出,匹配的值必须 等于所提供的价值.
当在构建器中使用时,字面值将被复制到 缓冲按它给出的类型。 变量名称表示 用于复制向构建器提供的值的槽.
特殊可变名称 _ 丢弃匹配的值; 即它
仅跳过输入中的适当位数。“ ”是
不允许在构建者模式中.
大小和单位
片段的大小按照数值或变量给出, 以冒号分隔 :
foo:32
该单位在规格清单中列为`单位'和`单位' 以冒号分隔的整数:
foo:4/integer-unit:8
大小为值中单位数;单位作为 位数。 单位可以使用,例如当您想要 匹配数个字节的整数,而不是数个比特.
对于整数和浮点,默认单位为 1 位;以保留事物
对齐字节边界, unit * size 在当前必须是多个
8. 对于二进制单位,默认单位为8,单位必须是
倍数八分.
如果大小被省略而类型是整数,大小默认为 8. 如果省去大小而类型为二进制,则段会 匹配输入中所有剩余字节; 此段可能只是 当匹配时,在图案结尾处使用.
大小也可以作为较早时匹配的整数变量 模式,如上方给出的例子。 当建造时, a 大小可能是指所提供环境的变量.
在建造者中,数字会被四舍五入、蒙上面具或加上以适应大小
单位;例如, '256:8' 给出二进制 Buffer<00>
因为最低的8位是0; '255:16 给出二进制
Buffer<00 ff>。 。 。 .
类型名称描述符
一个 integer, (中文(简体) ), binary, (中文(简体) ), string, (中文(简体) ), float未给出时
默认为 integer。 。 。 .
整数是大或小的,签名或未签名 整数。 最多32位的整数被支持. 已签名的整数为 2 的补充格式。 在JavaScript中,只有-(2^53)之间的整数 和 2^53 可显示,且位元运算符仅定义于 32位签名整数.
二进制只是字节缓冲;通常这会导致切片 输入缓冲器被返回时,请注意突变.
字符串是一个由给定字节数组成的UTF8字符串.
浮点是32位或64位 IEEE754 浮点值(这是 标准JavaScript与Java和Erlang一样使用.
强度描述符
整数可能是大-或小-endian;这是指哪个"end" of 构成整数的字节最为显著。 在网络中 协议整数通常是大后端的,意思是第一个 (左-最)字节是最重要的,但这并不总是 案例.
说明 big 表示整数将被解析(或写入)
(结果)作为大endian,和 little 表示整数将是
解说或写作小-endian。 默认为大德.
签名规格
整数片段可包括下列规格: signed 或者说 unsignedA级
签名整数被解析为两个补充格式。 默认是
未签名.
签名在构建者中被忽略.
字串
在图案中出现的引用字符串是字节的快取 其UTF8编码. 譬如说,
"foobar", _/binary
匹配任何以字节开头的缓冲 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72。 。 。 .
在构建器中使用时,引用的字符串会被复制到结果中,原因是 其UTF8编码的字节.
实例
以下对应的字节以数组表示:
方便所缘. 记住 match() 需要缓冲器
对应的字节。 “返回X为Y”或“输入X为Y”
Y"表示返回值是一个有X值映射到密钥的对象
对.
54
匹配单字节 54。 。 。 .
54:32
匹配字节 [0,0,54].
54:32/little
匹配字节 [54,0, 0].
54:4/unit:8
匹配字节 [0,0,54].
int:32/signed
匹配四个字节的二进制,返回一个签名的32位整数为
int。 。 。 .
len:16, str:len/binary
匹配二进制 2 + len 字节,返回未签名的 16 位
整数为 len 和长度缓冲 len 作为 str。 。 。 .
len:16, _:len/binary, rest/binary
匹配至少一个二进制 2 + len 字节,绑定一个未签名的 16 位
整数为 len,忽略下一个 len 字节,并绑定
剩余(可能为零长)二进制为 rest。 。 。 .
s:8, key:s/binary, value/binary
环境 {s:6, key: "foobar"},将匹配二进制
从 [6, 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72,.]开始.