2016-03-03 2 views
0

EDIT

Я нашел это:Распаковать структуру C в браузере?

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

В проблема в том, что я хочу конвертировать t их к нормальным объектам Javascript (номера, строки и т. д.).

Оригинальный вопрос

Я бы отправить данные через WebSocket упакованные с использованием C-структуру, и распаковать в браузере с помощью Javascript.

Я знаю, что модули существуют для node.js, но я не могу найти ничего на стороне клиента.

+2

Вам нужны две вещи: во-первых, формат сериализации. Во-вторых, код для конвертирования в и из этого формата сериализации для каждой интересующей вас платформы. Вы можете использовать текст, XML, JSON, какой-то двоичный код или что-то другое для вашего случая использования. JSON, вероятно, является хорошим выбором в большинстве случаев. –

+0

Нет JSON, я хочу бинарный формат. –

+0

Являются ли клиент и сервер на одной физической машине? –

ответ

0

Ok, после некоторого исследования, я, наконец, решил, что это не может быть хорошей идеей:

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

Коротко: JavaScript медленно при декодировании.

Возможно, это просто проще использовать JSON и Content-Encoding: gzip, если это не замедлит ваше веб-приложение.

0

ОК, https://www.npmjs.com/package/c-struct выглядит так, как вы хотите. Удачи!

+0

Это для node.js. –

+0

вам нужно дать краткий обзор того, что объясняет данная ссылка, ссылки могут легко погаснуть. – Dheeraj

0

Если вы знаете Python struct, то вам может понравиться structjs. Это моя попытка портировать структуру Python на javascript. Как бы то ни было, это для узла, но клиентский порт должен быть легким.

У вас не будет проблем с выравниванием или дополнением (вы можете указать их явно) для этой структуры, но вам может потребоваться указать 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... 
}; 
Смежные вопросы