javascript - 浏览器从二进制字符串中读取整数
问题描述
例如,我在这里有这个字符串
'x���'
根据您使用的设备,您可能看不到。这是2024000250
编码为 32 位有符号大端整数的数字,我使用 Node 生成的
let buffer = new Buffer(4);
b.writeInt32BE(2024000250).toString();
我在客户端收到了有问题的 4 个字节,但我似乎无法找到如何将它们转换回整数......
解决方案
我在这里可能大错特错。但据我所知,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,因为您使用的是有符号整数,以上不适用于所有情况。
推荐阅读
- ios - 由于系统资源不足而无法启动设备 [DIFFERENT QUERY]
- amazon-web-services - 使用 S3 和 Lambda 调整图像大小
- javascript - 如何从网络获取数据
- html - Bootstrap:在输入字段之前带有标签的浮动标签
- ios - 如何在 Swift 中停止(或暂停)设备的音频?
- ruby-on-rails - 在 Rails 中动态定义关联回调
- javascript - 如何阻止特定的 HTTP 请求在 JavaScript 中解析
- javascript - 如何使用材料 ui 自动完成进行搜索?
- selenium - Selenium 服务器:错误超时 chromedriver
- reactjs - getFirebase 不是使用 firebase auth create user 的函数错误