在浏览器上解压 C 结构?

Unpack a C struct on browser?

编辑

我找到了这个:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays

基本上如果我有这样的东西:

struct someStruct {
  unsigned long id;
  char username[16];
  float amountDue;
};

在客户端我可以做:

var ws = new WebSocket("ws://URI");
ws.binaryType = "arraybuffer";

ws.onmessage = function (e) {
    var buffer = e.data;
    var data_view = new DataView(buffer);
    
    // ... read the data into the buffer ...
    
    var idView = data_view.getUint32(0);
    var usernameView = data_view.getUint32(4);
    var amountDueView = data_view.getFloat32(20);
};

问题是我想将它们转换为正常的 Javascript 对象(数字、字符串等)。

原问题

我会通过使用 C 结构打包的 websocket 发送数据,并使用 Javascript 在浏览器上解压。

我知道 node.js 存在模块,但我找不到任何客户端。

好的, https://www.npmjs.com/package/c-struct 看起来像你想要的。 祝你好运!

好的,经过一些研究,我最终决定这不是一个好主意:

https://justin.harmonize.fm/development/2013/04/28/a-slower-js-msgpack.html

不久:javascript解码速度慢。

使用 JSON 和 Content-Encoding: gzip 可能更简单,如果它不会降低您的网络应用程序的速度。

如果您熟悉 Python struct, then you may like structjs。这是我尝试将 Python 结构移植到 javascript。实际上,它是用于 Node 的,但是客户端端口应该很容易。

您不会遇到该结构的对齐或填充问题(尽管您可以明确指定),但如果这是您的结构,您可能需要指示小端(通过格式字符串中的“<”)味道。你可能会这样做(我没有以任何方式测试这个例子):

let struct = require("./struct") // Node specific, you need to wrap it.
let someStruct = struct('<I16sf') // This is your struct definition
let ws = new WebSocket("ws://URI");
ws.binaryType = "arraybuffer";

ws.onmessage = e => {
    // Unpack using the structure definition. Unpack takes an ArrayBuffer.
    let [id, username, amountDue] = someStruct.unpack(e.data);
    // Use data...
};