Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Javascript类型的数组创建位掩码_Javascript_Arrays_Compression - Fatal编程技术网

为Javascript类型的数组创建位掩码

为Javascript类型的数组创建位掩码,javascript,arrays,compression,Javascript,Arrays,Compression,我正在使用,我需要尽可能多地压缩它们以用于联网目的 Javascript的最小内置数组是每个条目8位。这将存储0到255之间的数字 但是,我正在处理的数据将只包含0到3之间的数字。这可以使用2位来存储 所以我的问题是,如果我有一个8位数组,它只使用0到3之间的数字填充数据,那么如何将其“转换”为2位数组 我知道我需要使用a,但我不确定如何制作一个一次只能聚焦2位的遮罩 这里有一个函数,可以使用&和>对长度为4的8位数字到2位数组执行操作: 函数转换8to2(val){ var-arr=[];

我正在使用,我需要尽可能多地压缩它们以用于联网目的

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

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

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


我知道我需要使用a,但我不确定如何制作一个一次只能聚焦2位的遮罩

这里有一个函数,可以使用
&
>
对长度为4的8位数字到2位数组执行操作:

函数转换8to2(val){
var-arr=[];
arr.push((val&parseInt('11000000',2))>>6);
arr.push((val&parseInt('00110000',2))>>4);
arr.push((val&parseInt('00001100',2))>>2);
arr.push((val&parseInt('00000011',2));
返回arr;
}
功能转换器2to8(arr){
如果(arr.length!=4)
抛出“erorr”;

return(arr[0]注释中很难包含较长的示例:)

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

您需要跟踪两件事,当前数组索引和正在读取或写入的8位内存中的当前插槽。对于写入,
非常有用,对于读取
&
。使用移位(
)来选择位置

const randomTwoBitData=()=>Math.floor(Math.random()*4);
//随机2位数据数组
const sampleData=Array(256).fill().map(e=>randomTwoBitData());
//每8位4个条目
let buffer=new Uint8Array(sampleData.length/4);
//写数据让我的生活变得轻松
//因为数据可以被四整除,并且非常适合。
对于(设i=0;i2);//12是00001100二进制
readData.push((字节&48)>>4);//48是00110000二进制
readData.push((字节&192)>>6);//192是11000000二进制
});
//检查从压缩缓冲区读取的数据是否相同
//原样
log(`原始数据和重新读取的数据相同:`+

readData.every((e,i)=>e===sampleData[i]);
你应该看看
&
>
一个例子,选择前四位-使用二进制表示来强调发生了什么:
((Number.parseInt(“10100110”,2)和Number.parseInt(“11110000”,2))>>4。toString(2);
(“10100110”是我们的数据,“11110000”是我们的位掩码)@ AsffGeTe我得到了关于使用&运算符作为位掩码的说法。然而,我有点困惑如何在整个数组中使用它。我是否需要做一个循环,在该循环中,每个循环将位图更新为当前我想要的2位?对于写数据,可以只使用<代码> < <代码>,例如考虑两个2位。数据点已经写入(例如11和10),数据当前看起来是这样的:00001011(二进制),只需使用
让x=Number.parseInt(“00001011”,2);x |=(Number.parseInt(“10”,2)@ASDFGerte Ahhh我现在明白了!所以基本上是将要存储的数据进行适当的位移位,然后使用|运算符将其与现有数据组合。谢谢!哇,太棒了,谢谢!但是我如何将其转换为“convert2to8”函数呢?