@acuminous/bitsyntax

中文文档
0.1.2发布于 2022/09/01MITCommonJS近 30 天下载 142.8万

字节缓冲图案匹配

中文使用文档
文档目录14 节
  1. API 密码
  2. matcher
  3. parse 财务报告和审定财务报表 match
  4. builder
  5. build
  6. write
  7. 模式
  8. 变量或数值
  9. 大小和单位
  10. 类型名称描述符
  11. 强度描述符
  12. 签名规格
  13. 字串
  14. 实例

节点的字节匹配 。 联合来文

Node.js CI NPM version NPM downloads

给出一个用于解析和构建字节缓冲的紧凑语法, 来源于 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,.]开始.

版本与发布记录

@acuminous/bitsyntax 共发布 2 个版本,首次发布于 2022/09/01;过去 12 个月发布了 0 个版本。

版本发布日期距今
0.1.2latest2022/09/014 年前
0.1.12022/09/014 年前

关于 @acuminous/bitsyntax 的常见问题

@acuminous/bitsyntax 是什么?

字节缓冲图案匹配

如何安装 @acuminous/bitsyntax?

在项目目录运行 npm install @acuminous/bitsyntax,或使用 pnpm add / yarn add / bun add。

@acuminous/bitsyntax 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/acuminous__bitsyntax 是否存在。

@acuminous/bitsyntax 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@acuminous/bitsyntax 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=0.8。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@acuminous/bitsyntax 可以商用吗?

@acuminous/bitsyntax 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@acuminous/bitsyntax 的下载量有多少?

根据 npm 官方下载统计,@acuminous/bitsyntax 在 2026/10/05 – 2026/11/03 这 30 天内被下载 1,427,519 次,日均约 47,584 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@acuminous/bitsyntax 还在维护吗?

最新版本 0.1.2 发布于 2022/09/01(4 年前);至今共发布 2 个版本,其中过去 12 个月发布了 0 个;首次发布于 2022/09/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。