这个 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)
= ...
我不会算,你懂的。
我找到了这个函数,我想弄清楚它是如何将每个 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)
= ...
我不会算,你懂的。