从javascript类型数组创建(好)结构?

时间:2014-07-03 02:24:19

标签: javascript typed-arrays

我正在考虑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对象。建模数据不是问题;优雅地读写二进制数据是。

3 个答案:

答案 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