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

How does this lua function convert bits to 32 bit

我找到了这个函数,我想弄清楚它是如何将每个 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;

正在阅读 WWXXYYZZ
一个字节,包含 0-255 (0x00 到 0xFF) 的值,因此 W 包含这些值。

要计算更高的数,您需要乘以 256。
(X * 256)

如果更高,您需要再次 乘以 256。
(Y * 256 *256) 等同于 (Y * 65536)

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

将它们加在一起,none 个值重叠。
乘法只是一种防止值相互冲突的编程技巧,因此它们可以在一个连续的块中流入寄存器。


如果您取 3, 4, 5, 6 的值并只是将它们相加,而不进行预乘,您将得到 18。这不好,因为计算机不知道将每个字节放在哪里。假设它是 RGBA。好的,现在您有一个暗淡的红色像素,但是您的绿色、蓝色和 alpha 通道在哪里?

这就是它们相乘的原因,这样整个构造就可以序列化了。
3 + (4 *256) + (5 *256 *256) + (6 *256 *256 *256) = ...
我不会算,你懂的。