首页 > 解决方案 > 浏览器从二进制字符串中读取整数

问题描述

例如,我在这里有这个字符串

'x���'

根据您使用的设备,您可能看不到。这是2024000250编码为 32 位有符号大端整数的数字,我使用 Node 生成的

let buffer = new Buffer(4);
b.writeInt32BE(2024000250).toString();

我在客户端收到了有问题的 4 个字节,但我似乎无法找到如何将它们转换回整数......

标签: javascriptbinarytransmission

解决方案


我在这里可能大错特错。但据我所知,unicode 字符可以在 2-4 个字节之间。当您将二进制数据作为文本传输到客户端时,您可能会损坏此信息,因为客户端会将它们解释为 unicode。

如果我将该文本转换为客户端的 blob:

var b = new Blob(['x���'],{type:"application/octet-stream"});
b.size; //10 

如您所见,我收到了 10 个字节,这是错误的,应该是 4 个。

由于您在服务器端使用 Node,因此您可以直接将数据作为二进制字符串传输:

function createBuffer(v){
    var b = new ArrayBuffer(4),
        vw = new DataView(b);
    vw.setInt32(0,v);
    return b;
}

这将创建您的缓冲区,现在您不能将其按原样发送给客户端,将其表示为 json 或直接表示为二进制字符串。要将其表示为二进制,您不需要上述功能,您可以这样做:

("0".repeat(32) + (2024000250).toString(2)).slice(-32); //"01111000101000111100101011111010"

如果你想要json,你可以这样做:

function convertBuffToBinaryStr(buff){
    var res = [],
        l = buff.byteLength,
        v = new DataView(buff);
    for (var i = 0; i < l; ++i){
        res.push(v.getUint8(i));
    }
    return JSON.stringify(res);
}

现在试着看看这个输出:

convertBuffToBinaryStr(createBuffer(2024000250)); //"[120,163,202,250]"

回到客户端,您必须对此进行解释:

function interpret(json){
    json = JSON.parse(json);
    return parseInt(json.map((d)=>("0".repeat(8) + d.toString(2)).slice(-8)).join(""),2);
}

现在尝试:

interpret("[120,163,202,250]"); //2024000250

注意:对于您的解释函数,您必须使用 dataView 到 setUint8 并在最后使用 getInt32,因为您使用的是有符号整数,以上不适用于所有情况。


推荐阅读