javascript - 使用 WebSocket 发送位

标签 javascript binary

如果我有一个包含 1 和 0 的字符串,如下所示:

“0101101”

我是否可以使用 WebSocket.prototype.send 方法仅发送这些位?

首先我必须将它们转换为 ArrayBuffer,我该怎么做?

如果我只是发送字符串,每个 1 和 0 都是 1 个字节长(因为它们是字符而不是位,并且是 UTF-8 编码的),那是行不通的,我怎样才能将这些字符串位转换为ArrayBuffer 并发送它们?

不,这不是重复,因为它不是将位字符串转换为 int 值。这是关于将其转换为 ArrayBuffer

最佳答案

正如您已经暗示的那样,没有直接的方法可以通过 websocket api 直接发送位数组。您需要将其转换为 ArrayBuffer。由于 ArrayBuffer 不能直接修改,只能通过 TypedArray 修改,所以我建议:

  • 可以根据需要在字符串前面添加前导零
  • 将字符串拆分为 8 位部分
  • 从位中解析整数
  • 将这些整数添加到 Uint8Array
  • 从数组中获取缓冲区
  • 通过 websocket 发送缓冲区

这可能如下所示:

function binaryStringToArrayBuffer(data) {

    while (data.length % 8 != 0) {
        data = '0' + data;
    }

    var buf = new ArrayBuffer(data.length / 8);
    var result = new Uint8Array(buf);


    var dataArray = data.split('');

    var idx = 0;
    while(dataArray.length > 0) {
        var bits = dataArray.splice(0, 8);
        var bitsAsInt = parseInt(bits.join(''), 2);

        result[idx] = bitsAsInt;
        idx++;
    }
    return result.buffer;
}

var data = "01010111101011010111110001100000000000000101001";
var buffer = binaryStringToArrayBuffer(data);

getYourWebSocket().send(buffer);

关于javascript - 使用 WebSocket 发送位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38142238/

相关文章:

c++ - 在 C++ 中读取二进制文件返回意外值

回发期间 Javascript 检测

javascript - 用于可拖动页面元素的 css 框架和用于服务器端位置保存的回调

javascript - slingshot meteor 包上传前的改动

text - 二进制协议(protocol)与文本协议(protocol)

binary - 在计算机中,为什么最大整数加一会导致零?

javascript - knockout 带有继承数据的 js 嵌套模型

javascript - 在 JQuery 中使图像遵循圆形路径的最佳方法?

go - 如何在 socks5 代理中将 2 个字节的端口号返回给客户端?

java - 十进制转二进制,打印错误答案