这个lua函数如何将比特转换为32位

我找到了这个函数,正在尝试弄清楚它如何将每个字符(8位)转换为32位。 该函数的代码如下。

local function getBits32(streamString)
  local W,X,Y,Z = string.byte(streamString,streamPosition,streamPositon + 3);

  streamPosition = streamPosition + 4;

  return(Z * 16777216)+(Y * 65536)+(X * 256)+ W;
end;
点赞
用户3342050
用户3342050

这句话是用 markdown 格式编写的,表示将要讲解字节和乘法在计算机中的应用。

一个字节可以存储 0-255 的值 _(0x00 到 0xFF)_,W就是这个范围内的数字。

如果需要表示更大的数字,就需要乘以 256。 (X * 256)

如果还要表示更大的数字,需要再次乘以 256。 (Y * 256 *256) 等同于 (Y * 65536)

最后,再次乘以 256。 (Z * 256 *256 *256) 等同于 (Z * 16777216)

将它们加起来,这些值不会重叠。

乘法只是编程技巧,可以避免数值重叠,以便将它们作为一个连续的块流入寄存器中。


如果你拿到值 3、4、5、6 并且直接相加,没有预先乘法,你会得到 18。这是不好的,因为计算机不知道如何将每个字节放在哪里。比如说,RGBA表示四个通道:红、绿、蓝和 alpha,但你只有一个灰暗的红色像素,那么你的其它通道在哪里呢?

这就是为什么需要使用乘法,以便整个数据可以被序列化。 3 + (4 *256) + (5 *256 *256) + (6 *256 *256 *256) = ...

我不会详细计算,但是你可以理解这个过程。

2021-06-27 06:03:19