Javascript 如何获取一个字节中的最后2位

Javascript 如何获取一个字节中的最后2位,javascript,image-processing,Javascript,Image Processing,在字节数组中,例如[40,0,156,243],我需要从数组的每个字节的最后两位中提取1个字节。这用于解码和编码PICO-8盒带(),它将程序数据存储在PNG图像中。以下是我收到的关于数据存储方式的信息: 对于png文件,每个像素组件的低2位组成一个字节,因此每个像素1个字节。最后32个字节是PNG的元数据(因为160*205=0x8020,额外32个字节) byte=(a若要获取最后两位,请尝试value&3而不是value%100(value%100在十进制中除以100后,取value的剩余

在字节数组中,例如
[40,0,156,243]
,我需要从数组的每个字节的最后两位中提取1个字节。这用于解码和编码PICO-8盒带(),它将程序数据存储在PNG图像中。以下是我收到的关于数据存储方式的信息:

对于png文件,每个像素组件的低2位组成一个字节,因此每个像素1个字节。最后32个字节是PNG的元数据(因为160*205=0x8020,额外32个字节)

byte=(a若要获取最后两位,请尝试
value&3
而不是
value%100
value%100
在十进制中除以100后,取
value
的剩余部分,而不是二进制)。然后,您需要将这两位移到最后一个字节中的适当位置。类似这样:

  r = (pixels[n][0] & 3) << 4;
  g = (pixels[n][1] & 3) << 2;
  b = (pixels[n][2] & 3);
  a = (pixels[n][3] & 3) << 6;

  val = a | r | g | b; // assembled byte
...
r = (pixels[n][0] & 3);
g = (pixels[n][1] & 3);
b = (pixels[n][2] & 3);
a = (pixels[n][3] & 3);
byte = (a << 6) | (r << 4) | (g << 2) | b;
str += String.fromCharCode(byte);
...

r=(像素[n][0]&3)要获取最后两位,请尝试
value&3
而不是
value%100
value%100
value
除以100后的小数部分,而不是二进制部分。)然后需要将这两位移到最后一个字节中的适当位置。如下所示:

  r = (pixels[n][0] & 3) << 4;
  g = (pixels[n][1] & 3) << 2;
  b = (pixels[n][2] & 3);
  a = (pixels[n][3] & 3) << 6;

  val = a | r | g | b; // assembled byte
...
r = (pixels[n][0] & 3);
g = (pixels[n][1] & 3);
b = (pixels[n][2] & 3);
a = (pixels[n][3] & 3);
byte = (a << 6) | (r << 4) | (g << 2) | b;
str += String.fromCharCode(byte);
...

r=(像素[n][0]&3)我不是js的人,但我认为代码应该是这样的:

  r = (pixels[n][0] & 3) << 4;
  g = (pixels[n][1] & 3) << 2;
  b = (pixels[n][2] & 3);
  a = (pixels[n][3] & 3) << 6;

  val = a | r | g | b; // assembled byte
...
r = (pixels[n][0] & 3);
g = (pixels[n][1] & 3);
b = (pixels[n][2] & 3);
a = (pixels[n][3] & 3);
byte = (a << 6) | (r << 4) | (g << 2) | b;
str += String.fromCharCode(byte);
...
。。。
r=(像素[n][0]&3);
g=(像素[n][1]&3);
b=(像素[n][2]&3);
a=(像素[n][3]&3);

byte=(a我不是js迷,但我认为代码应该是这样的:

  r = (pixels[n][0] & 3) << 4;
  g = (pixels[n][1] & 3) << 2;
  b = (pixels[n][2] & 3);
  a = (pixels[n][3] & 3) << 6;

  val = a | r | g | b; // assembled byte
...
r = (pixels[n][0] & 3);
g = (pixels[n][1] & 3);
b = (pixels[n][2] & 3);
a = (pixels[n][3] & 3);
byte = (a << 6) | (r << 4) | (g << 2) | b;
str += String.fromCharCode(byte);
...
。。。
r=(像素[n][0]&3);
g=(像素[n][1]&3);
b=(像素[n][2]&3);
a=(像素[n][3]&3);

字节=(a我假设这肯定比我所拥有的更接近正确,但是出于某种原因,我仍然得到乱七八糟的输出。我知道数据没有以任何方式压缩。我已经通过多种方式改变了顺序,令人惊讶的是,它们的顺序似乎没有什么区别,因为输出完全相同。如果有帮助的话s、 所有的值现在都显示为0、1、2或3(看起来不正确)。好的,我做了一些错误的事情,但它仍然不正确。
console.log(r、g、b、a)
现在看起来是这样的:
16 0 0 192
,但是
str
仍然是乱七八糟的。在这种情况下字符串应该是什么样子?可能值必须存储为十六进制字符串?str+=val.toString(16);@ChrisClower-我怀疑有某种簿记错误。复杂的
像素
数组处理有什么原因吗?为什么不去掉
像素
,直接索引到
imgData
,从每次迭代增加4的偏移量中获得4字节的值?还有,输入(
imgData
)是什么看起来像?我假设这肯定比我所拥有的更接近正确,但是出于某种原因,我仍然得到乱七八糟的输出。我知道数据没有以任何方式压缩。我已经通过多种方式改变了顺序,令人惊讶的是,它们的顺序似乎没有什么区别,因为输出完全相同。如果这很有帮助,所有的值现在都显示为0、1、2或3(这似乎不正确)。好的,我做了一些错误的事情,但它仍然不正确。
console.log(r、g、b、a)
现在看起来是这样的:
16 0 0 192
,但是
str
仍然是乱七八糟的。在这种情况下字符串应该是什么样子?可能值必须存储为十六进制字符串?str+=val.toString(16);@ChrisClower-我怀疑有某种簿记错误。复杂的
像素
数组处理有什么原因吗?为什么不去掉
像素
,直接索引到
imgData
,从每次迭代增加4的偏移量中获得4字节的值?还有,输入(
imgData
)是什么看起来像