在浏览器上解压缩C结构?

时间:2016-03-03 19:54:14

标签: javascript struct binary client binary-data

修改

我发现了这个:

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存在模块,但我找不到任何客户端。

3 个答案:

答案 0 :(得分:1)

如果您熟悉Python struct,则可能需要structjs。这是我尝试将Python结构移植到javascript。实际上,它适用于Node,但客户端端口应该很容易。

对于该结构,你不会遇到对齐或填充(你可以明确指定那些)的问题,但你可能需要指出little-endian(格式字符串中的'<'),如果这是你的味道。你可能会这样(我没有以任何方式测试过这个例子):

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...
};

答案 1 :(得分:0)

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

答案 2 :(得分:0)

好的,经过一番研究,我终于认定这不是一个好主意:

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

很快:javascript解码速度很慢。

如果它不会减慢您的网络应用程序的速度,使用JSON和User Class objectID [String]| userName [String]| password [String] | groupsUserBelongsTo [Array of numbers]| emailAddress [String] Group Class objectId [Int]| groupName [String] | UserIDsOfGroupMembers (one to many relation to userID.user)| PostsOfGroups (one to many relation to objectId.post) Post Class objectId [String]| Timestamp [String] | postSubject [String]| postBody [String]| groupsPostBelongsTo [Array]| postAuthor [String] | commentsOfGroups (one to many relation to objectId.comment) Comment Class objectId [String]| Timestamp [String] | commentBody[String]| postCommentsBelongsTo [Array] | commentAuthor [String] 可能会更简单。