我正在考虑javascript中的类型化数组;特别是,读取二进制文件头。阅读MDN Typed Arrays documentation,他们愉快地说我们可以代表C结构:
struct someStruct {
unsigned long id;
char username[16];
float amountDue;
};
使用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);
然后你可以说amountDueView[0]
但似乎忽略了将标量视为单元素数组很糟糕且能够说sizeof(someStruct)
这样的事情也很有用的事实。
所以...还有更好的东西吗? MDN引用js-ctypes,但它不是标准的javascript。
编辑:是的,我知道javascript对象。建模数据不是问题;优雅地读写二进制数据是。
答案 0 :(得分:2)
对于它的价值,有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}
它没有特别好记录(上面的例子非常受欢迎),但它非常好。
最大的警告是,它依赖于javascript对象,其属性保持按照他们定义的顺序,实际上是这种情况,但不是javascript规范的一部分。我怀疑这种情况永远不会真正发生变化,因为它会破坏一些事情,但仍然存在。
答案 1 :(得分:0)
难道你不能只在JS中定义一个对象来建模吗?
var someObject = {
Id:2,
username: [],
amountDue:5
};
答案 2 :(得分:-2)
您很可能不需要为您的应用程序输入类型数组;如果没有他们,世界其他地方的生存就会很好。 IE < 10
甚至不支持他们。
您可以像这样编写对象
var data = {id: 123, username: "bob", amountDue: 123.45};
并且像这样阅读
data.id;
// 123
data.username;
// "bob"
尝试阅读未设置的密钥
data.foo;
// undefined
在确定
后设置密钥data.foo = "bar";
// "bar"
并删除密钥
delete data.foo;
// true
尝试阅读已删除的密钥
data.foo;
// undefined