Nat*_*ate 1 javascript typed-arrays
我正在考虑 javascript 中的类型化数组;特别是读取二进制文件头。阅读MDN 类型数组文档,他们愉快地说我们可以表示 C 结构:
struct someStruct {
unsigned long id;
char username[16];
float amountDue;
};
Run Code Online (Sandbox Code Playgroud)
使用 JavaScript:
var buffer = new ArrayBuffer(24);
// ... read the data into the buffer ...
var idView = new Uint32Array(buffer, 0, 1);
var usernameView = new Uint8Array(buffer, 4, 16);
var amountDueView = new Float32Array(buffer, 20, 1);
Run Code Online (Sandbox Code Playgroud)
然后你可以说,amountDueView[0]但似乎忘记了这样一个事实:将标量视为单元素数组是很糟糕的,并且能够说类似的话sizeof(someStruct)也很有用。
那么……还有更好的吗?MDN 引用了js-ctypes,但它不是标准的 javascript。
编辑:是的,我了解 javascript 对象。数据建模不是问题;问题在于。优雅地读取和写入二进制数据。
就其价值而言,有jBinary,它可以让您执行以下操作:
var binary_data = '\x0f\x00\x00\x00Bruce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xecQXA';
var myTypeset = {
'jBinary.all': 'someStruct',
'jBinary.littleEndian': true,
someStruct: {
id: 'uint32',
username: ['string0', 16],
amountDue: 'float'
}
};
var binary = new jBinary(binary_data, myTypeset);
header = binary.readAll(); // Object {id: 15, username: "Bruce", amountDue: 13.520000457763672}
header.username = "Jim";
binary.writeAll(header);
binary.readAll(); // Object {id: 15, username: "Jim", amountDue: 13.520000457763672}
Run Code Online (Sandbox Code Playgroud)
它没有特别详细的文档记录(非常欢迎像上面这样的示例),但它非常好。
最大的警告是它依赖于 javascript 对象,其属性保持其定义的顺序,实际上就是这种情况,但不是 javascript 规范的一部分。我怀疑这永远不会真正改变,因为它会破坏大量的东西,但仍然如此。