繁体   English   中英

JavaScript Node.Js 缓冲区到二进制

[英]JavaScript Node.Js Buffers to Binary

我在 Node.JS 缓冲区的帮助下发送和接收数据包,但我不确定如何将这些缓冲区转换为二进制表示形式。 我试过了,但没用

let buff = Buffer.alloc(10);
buff[0] = 10;
buff[1] = 16;
buff[2] = 20;
buff[3] = 32;
buff[4] = 9;

console.log(buff);
console.log(buff.toString('binary'));

根据文档'binary''latin1'的别名

如果你想要一个二进制表示,最简单的方法是获取缓冲区的字符串表示,只有10是将缓冲区转换为十六进制表示,然后将此表示解析为 BigInt,获取 BigInt 的基数 2,最后用不重要的零填充字符串

function buf2bin (buffer) {
  return BigInt('0x' + buffer.toString('hex')).toString(2).padStart(buffer.length * 8, '0')
}

如果您要问的是您想要 Buffer 中每个单独字节的字符串表示(以二进制表示)全部组合成一个字符串,每个字节都有空格分隔符,那么您可以这样做:

function convertBufferToBinaryString(buf, len) {
    let result = [];
    for (let i = 0; i < len; i++) {
        result.unshift(buf[i].toString(2).padStart(8, "0"));
    }
    return result.join(" ");
}

// sample usage

let buff = Buffer.alloc(10);
buff[0] = 10;
buff[1] = 16;
buff[2] = 20;
buff[3] = 32;
buff[4] = 9;

let str = convertBufferToBinaryString(buff, 5);
console.log(str);

由于这是自定义 output 格式,因此没有内置方法可以执行此操作。 您可以使用.toString(2)将任何单个数字转换为二进制字符串表示,但要组合缓冲区中每个单独字节的二进制字符串表示,您必须自己构建组合结果(如上所示)。

注意:此实现假定您希望缓冲区的[0]元素位于结果字符串的右端。 这就是它在构建结果数组时使用.unshift()的原因。 如果您希望[0]元素位于字符串的左端,请改用.push()

使用padStart组合简单地reduce为字符串。

const buff = Buffer.alloc(10);
buff[0] = 10;
buff[1] = 16;
buff[2] = 20;
buff[3] = 32;
buff[4] = 9;

const paddedBinString = buff.reduce(
    (acc, byte) => (acc += byte.toString(2).padStart(8, "0")),
    ""
);

console.log(paddedBinString);
// 00001010 00010000 00010100 00100000 00001001 00000000 00000000 00000000 00000000 00000000

我是这样做的:

const hexChar2bin = c =>
    ({
        0: '0000',
        1: '0001',
        2: '0010',
        3: '0011',
        4: '0100',
        5: '0101',
        6: '0110',
        7: '0111',
        8: '1000',
        9: '1001',
        a: '1010',
        b: '1011',
        c: '1100',
        d: '1101',
        e: '1110',
        f: '1111',
    }[c]);

export default function buf2bin(buf) {
    return buf.toString('hex').split('').map(hexChar2bin).join('');
}

console.log(buf2bin(Buffer.from(' '))); // 00100000 (space character is decimal 32)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM