如何在js中打包无符号整数?

时间:2018-07-19 19:09:32

标签: javascript

tl; dr-我需要一个与struct.pack("!I", <num_here>)等效的js

我正在尝试为我不久前构建的python聊天服务器创建电子前端。当我建立上述服务器时,我将其设置为使所有数据都位于json中,并在发送数据时以消息长度作为前缀(通过struct.pack打包),以便我可以确定何时得到了所有数据。因此,如果我有'{"USERNAME" : "codeWonderland"}',我会在其前面加上\x00\x00\x00\x1e

我找到了库bufferpack,但是每次使用pack操作时,库都会不断返回\x00\x00\x00\x00。该库也有很多分支,但是所有更改都是任意的。此外,我自己尝试修复该库,但实际上每个变量只是一个字母,因此很难解析。

有什么方法可以更轻松地完成打包?我真的不需要担心拆包,因为当从服务器接收到json时,我可以从字面上直接使用json上的json,从字符串中修剪长度并正常解析。

1 个答案:

答案 0 :(得分:1)

怎么样?

const output = document.getElementById('output');

function bigEndianOf(n)
{
    return Uint8Array.from([
        (n & 0xFF000000) >>> 24,
        (n & 0x00FF0000) >>> 16,
        (n & 0x0000FF00) >>>  8,
        (n & 0x000000FF) >>>  0,
    ]);
}

document.getElementById('text').addEventListener('change', e => {
  const prefix = new TextDecoder('utf-8').decode(bigEndianOf(e.target.value.length));
  output.value = prefix;
})
text: <input id="text" /><br />
length prefix string: <input id="output" readonly />