我发现了这个:
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存在模块,但我找不到任何客户端。
答案 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]
可能会更简单。