gpt4 book ai didi

javascript - 为 Javascript 类型数组创建位掩码

转载 作者:行者123 更新时间:2023-11-30 14:32:38 25 4
gpt4 key购买 nike

我正在使用 Javascript typed arrays ,我需要尽可能地压缩它们以用于网络目的。

Javascript 内置的最小数组是每个条目 8 位。这将存储 0 到 255 之间的数字。

但是我正在处理的数据将只包含 0 到 3 之间的数字。这可以使用 2 位存储。

所以我的问题是,如果我有一个 8 位数组,其中仅使用 0 到 3 之间的数字填充数据,我如何才能将其“转换”为 2 位数组?

我知道我需要使用 bit operator ,但我不确定如何制作一次只关注 2 位的掩码。

最佳答案

较长的示例很难放入评论中:)

首先,请注意,网络数据通常已经被压缩 - 例如使用 gzip(特别是当担心数据量和网络库设置正确时)。然而,情况并非总是如此,并且仍然不如手动操作紧凑。

您需要跟踪两件事,当前数组索引和正在读取或写入的 8 位中的当前槽。对于写作,|很有用,适合阅读 & .移位(<<>>)用于选择位置。

const randomTwoBitData = () => Math.floor(Math.random() * 4);

//Array of random 2-Bit data
const sampleData = Array(256).fill().map(e => randomTwoBitData());

//four entries per 8-Bit
let buffer = new Uint8Array(sampleData.length / 4);

//Writing data, i made my life easy
//because the data is divisible by four and fits perfectly.
for (let i = 0; i < sampleData.length; i += 4) {
buffer[i / 4] =
sampleData[i] |
(sampleData[i + 1] << 2) |
(sampleData[i + 2] << 4) |
(sampleData[i + 3] << 6);
}

//padding for console logging
const pad = (s, n) => "0".repeat(Math.max(0, n - s.length)) + s;

//Some output to see results at the middle
console.log(`buffer: ${pad(buffer[31].toString(2), 8)}, ` +
`original data: ${pad(sampleData[127].toString(2), 2)}, ` +
`${pad(sampleData[126].toString(2), 2)}, ` +
`${pad(sampleData[125].toString(2), 2)}, ` +
`${pad(sampleData[124].toString(2), 2)}`);

console.log("(order of original data inverted for readability)");
console.log("");

//Reading back:
let readData = [];
buffer.forEach(byte => {
readData.push(byte & 3); // 3 is 00000011 binary
readData.push((byte & 12) >> 2); // 12 is 00001100 binary
readData.push((byte & 48) >> 4); // 48 is 00110000 binary
readData.push((byte & 192) >> 6); // 192 is 11000000 binary
});

//Check if data read from compacted buffer is the same
//as the original
console.log(`original data and re-read data are identical: ` +
readData.every((e, i) => e === sampleData[i]));

关于javascript - 为 Javascript 类型数组创建位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50938898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com