structjs - javascript中的 Python 风格的 struct 模块
此模块执行 Javascript 值和作为 javascript 表示的 C 结构的转换 矩阵缓冲 对象。 这可用于处理存储在文件中的二进制数据或来自网络连接的数据等来源. 用这个 格式字符串 用于简洁描述 C 结构的布局和打算转换为/从 javascript 值.
说明: 与Python struct不同,这个模块不支持本土大小和对齐(这在javascript中不会有很多意义). 相反,请明确指定字节顺序并发出字节.
几种方法: 结构 使用缓冲参数。 这指的是 矩阵缓冲 对象.
说明: 在 Python struct 中,缓冲参数是指执行缓冲协议的对象.
职能
模块定义了以下函数:
结构(单位:千美元)格式(中文(简体) )
返回一个按照 格式字符串 格式。 。 。 .
说明: 这不是一个建筑师, 不要使用新的。 在Python,这是一个构造器。 Python 具有打包和打包的功能,没有使用struct函数创建对象的中间步骤. 然而,我决定不列入这些功能,因为这些功能是多余的,我不想不必要地把接口弄乱。 它们现在都在代码中,但在注释中.
对象
编译的 Struct 对象返回 结构 支持下列方法和属性:
包装(单位:千美元)v1, v2, (英语).(中文(简体) )
返回一个 矩阵缓冲 包含值的对象 v1, v2, (英语). 按 格式。参数必须精确地与格式所要求的值相匹配(result.byteLength 将等于 大小) (中文(简体) ).
装入(单位:千美元)缓冲,偏移,v1,v2,.(中文(简体) )
包装值 v1, v2, (英语). 根据 格式 将已打包的字节写入 矩阵缓冲 缓冲 开始于位置 页:1。注意: 页:1 是一个必要的论据.
打开(单位:千美元)缓冲(中文(简体) )
解开包装 矩阵缓冲 缓冲 (大概由 pack()根据 格式。其结果是,即使它包含一个完全相同的物品,它也会是一团一团。 缓冲器在字节中的大小必须与格式所要求的大小相匹配,如 大小。 。 。 .
打开(单位:千美元)页:1(中文(简体) )
解开包装从 矩阵缓冲 缓冲 开始于位置 页:1,根据 格式。其结果是,即使它包含一个完全相同的物品,它也会是一团一团。 缓冲器的大小, 以字节为单位, 减去 页:1,必须至少是格式所要求的大小,如 大小。 。 。 .
缩写( u)(单位:千美元)缓冲(中文(简体) )
根据 格式。此函数返回从缓冲器读取大小相同的块,直到其全部内容被消耗为止。 以字节表示的缓冲器大小必须比 格式,反映于 大小 (这没有执行,剩下的字节被默默地忽略了).
每个迭代都产生一股由下列因素指定的二重力: 格式字符串。 。 。 .
格式
这个 格式字符串 用于构造此对象.
大小
结构的计算大小(因此 矩阵缓冲 生成对象 包( ) 方法)对应 格式。 。 。 .
格式字符串
格式字符串是用于指定包装和打包数据时的预期布局的机制. 他们是从 格式字符,它指定了数据包装/解包的类型。 此外,还有特殊字符来控制 字节顺序。 。 。 .
说明: 与 Python struct 不同的是,本模块没有用于表示本地大小和对齐的特殊格式字符.
字节顺序
默认情况下,C类型以标准格式和字节顺序表示,而不以任何方式对齐(没有插入垫字节).
说明: 这与使用本地格式的 Python struct 不同 .
根据下表,格式字符串的第一个字符可以用来表示字节顺序:
| 字符 | 字节顺序 |
|---|---|
| < | 小恩地语 |
| > 翻译: | 大号 |
| 如果第一个字符不是其中之一,则假设为">". |
与 Python 结构的区别 :
Python struct有更多的选择,对于javascript来说没有那么合理.
不使用“@”、“=”、“!” 。 使用“ >” 表示“! ” .
无出土供养.
无对接. 用"x"来做贴.
格式字符
格式字符有以下含义;C和ES值之间的转换应因其类型而明显. " Size " 一栏是指以字节表示的包装值的大小:
| 格式 | C 类型 | ES 类型 | 大小 |
|---|---|---|---|
| 页:1 | 垫字节 | 1个 | |
| c. 国家 | 字符 | 长度字符串 1 | 1个 |
| 页:1 | 签名字符 | 数目 | 1个 |
| 页:1 | 未签名字符 | 数目 | 1个 |
| ? 吗? | 布尔( B) | 布尔 | 1个 |
| 页:1 | 简称 | 数目 | 2个 |
| 页:1 | 未签名的简短 | 数目 | 2个 |
| (单位:千美元) | 单位 | 数目 | 页:1 |
| 一、导 言 | 未签名 | 数目 | 页:1 |
| f 时 | 浮动 | 数目 | 页:1 |
| d. 国家 | 双 | 数目 | 第8条 |
| 编号 | 字符 [] | 字符串 | |
| 页:1 | 字符 [] | 字符串 |
与 Python 的区别 :
不取"l","l","q","Q","P",不取整数,不取活字,不取双数,只取数字.
对于"l"和"L"使用"i"和"我". 对于"P",酌情使用"H"或"我".
'q'和'Q'不能在javascript中充分代表. 用"i"或"我"来代替.
没有'n'或'n'.
格式字符前可进行整体重复计数. 例如,格式字符串 '4h' 意思是完全一样 'hhhh'。 。 。 .
格式之间的空白字符不被接受.
说明: Python struct 忽略了白空间字符(一个计数及其格式虽然不能包含白空间).
对于''格式字符,计数被解释为字符串的大小,而不是像其他格式字符一样的重复计数;例如, '10s' 表示一个10字节字符串,而 '10c' 指十个人物. 如果不给出一个计数,则默认为 1. 包装时,串被切开或加上适当的无字节来使其适合. 对于打包,产生的字符串总是有精确的指定字节数.
说明: Python struct 接受特例;"0s"表示一单空字符串(而"0c"表示0个字符).
说明: Python 保证在使用一个整数格式('b','B','h','H','i','I','l','L','q','Q')来包装一个值x时,如果x超出了该格式的有效范围,则会提高struct.error.
“ p” 格式字符编码为“ Pascal 字符串”, 意思是存储在一个 固定字节数,由伯爵给出. 存储的第一个字节是字符串的长度,或255,以较小者为准. 字符串的字节接踵而来. 如果字符串传递到 包( ) 长度太长( 比数倒数 1 长), 只有领先 count-1 字符串的字节被存储 。 如果字符串短于 count-1,它用无字节来添加,这样就可以使用精确的字节。 请注意: 无包装 (),则 'p' 格式字符消耗 count 字节,但返回的字符串永远不能包含超过255个字符.
给 '?' 格式字符,返回值为 真实 或者说 虚假。在打包时,使用了参数对象的真值。 原生或标准布尔表示值中的0或1将被打包,任何非零值都将是 true 解开时.
实例:
包装/卸下三个整数的基本例子:
let struct = require("./struct"), s = struct('hhi'), b = new ArrayBuffer(s.size)
s.pack(1, 2, 3) // ArrayBuffer {}
new Uint8Array(s.pack(1, 2, 3)) // Uint8Array { '0': 0, '1': 1, '2': 0, '3': 2, '4': 0, '5': 0, '6': 0, '7': 3 }
s.unpack(new Uint8Array([0, 1, 0, 2, 0, 0, 0, 3]).buffer) // [ 1, 2, 3 ]
s.size // 8
s.pack_into(b, 0, 1, 2, 3)
new Uint8Array(b) // Uint8Array { '0': 0, '1': 1, '2': 0, '3': 2, '4': 0, '5': 0, '6': 0, '7': 3 }
未包装的字段可以通过指定变量来命名 :
let struct = require("./struct"), s = struct("<10sHHb")
let record = s.pack("Raymond ", 4658, 264, 8)
let [name, serialnum, school, gradelevel] = s.unpack(record)