32 位 int 结构位似乎不匹配 (nodejs)
32-bit int struct bits don't seem to match up (nodejs)
我有一个定义一组图块的文件(用于在线游戏)。每个图块的格式如下:
x: 12 bits
y: 12 bits
tile: 8 bits
总共32位,所以每个tile可以表示为一个32位的整数。
有关文件格式的更多信息可在此处找到:
http://wiki.minegoboom.com/index.php/LVL_Format
http://www.rarefied.org/subspace/lvlformat.html
4 字节结构没有沿字节边界断开。如您所见,x: 和 y: 都定义为 12 位。 IE。 x
存储在 1.5 个字节中,y
存储在 1.5 个字节中,tile
存储在 1 个字节中。
虽然x
和y
使用了12位,但它们的最大值是1023
,所以它们可以用10位表示。这取决于格式的创建者。我猜他们只是在填充一些东西,这样他们就可以为每个图块使用一个 32 位整数?无论哪种方式,对于 x
和 y
我们都可以忽略最后的 2 位。
我正在使用 nodejs 缓冲区来读取文件,我正在使用以下代码来读取值。
var n = tileBuffer.readUInt32LE(0);
var x = n & 0x03FF;
var y = (n >> 12) & 0x03FF;
var tile = (n >> 24) & 0x00ff;
这段代码工作正常,但是当我自己阅读这些位时,为了更好地理解二进制,我发现了一些让我感到困惑的东西。
举个例子,int 表示如下:
x: 1023
y: 1023
tile: 1
在地图编辑器中创建图块并将生成的文件读入缓冲区 returns <Buffer ff f3 3f 01>
当我将每个字节转换为一串位时,我得到以下信息:
ff = 11111111
f3 = 11110011
3f = 00111111
01 = 00000001
11111111 11110011 00111111 00000001
我想我应该只取前 12 位作为 x
但砍掉最后 2 位。将接下来的 12 位作为 y
,再砍掉 2 位,剩下的 8 位就是 tile
.
x: 1111111111
y: 0011001111
tile: 00000001
x
正确 (1111111111 = 1023),y
错误 (0011001111 = 207,而不是 1023),瓦片正确 (00000001 = 1)
我很困惑,显然遗漏了一些东西。
按此顺序查看更有意义:(这将是 n
的二进制表示)
00000001 00111111 11110011 11111111
按此顺序,您可以轻松地进行视觉遮蔽和移动。
你所做的问题是,例如在11111111 11110011
中,属于第一个字段的第二个字节的位在右边(该字节的最低部分),按该顺序是不连续的。
此外,使用 0x03FF
进行掩码使得前两个字段有 10 位,其中两位刚刚消失。您可以通过使用 0x0FFF
掩码使它们成为 12 位。就像现在一样,您实际上有两个填充位。
我有一个定义一组图块的文件(用于在线游戏)。每个图块的格式如下:
x: 12 bits
y: 12 bits
tile: 8 bits
总共32位,所以每个tile可以表示为一个32位的整数。
有关文件格式的更多信息可在此处找到:
http://wiki.minegoboom.com/index.php/LVL_Format
http://www.rarefied.org/subspace/lvlformat.html
4 字节结构没有沿字节边界断开。如您所见,x: 和 y: 都定义为 12 位。 IE。 x
存储在 1.5 个字节中,y
存储在 1.5 个字节中,tile
存储在 1 个字节中。
虽然x
和y
使用了12位,但它们的最大值是1023
,所以它们可以用10位表示。这取决于格式的创建者。我猜他们只是在填充一些东西,这样他们就可以为每个图块使用一个 32 位整数?无论哪种方式,对于 x
和 y
我们都可以忽略最后的 2 位。
我正在使用 nodejs 缓冲区来读取文件,我正在使用以下代码来读取值。
var n = tileBuffer.readUInt32LE(0);
var x = n & 0x03FF;
var y = (n >> 12) & 0x03FF;
var tile = (n >> 24) & 0x00ff;
这段代码工作正常,但是当我自己阅读这些位时,为了更好地理解二进制,我发现了一些让我感到困惑的东西。
举个例子,int 表示如下:
x: 1023
y: 1023
tile: 1
在地图编辑器中创建图块并将生成的文件读入缓冲区 returns <Buffer ff f3 3f 01>
当我将每个字节转换为一串位时,我得到以下信息:
ff = 11111111
f3 = 11110011
3f = 00111111
01 = 00000001
11111111 11110011 00111111 00000001
我想我应该只取前 12 位作为 x
但砍掉最后 2 位。将接下来的 12 位作为 y
,再砍掉 2 位,剩下的 8 位就是 tile
.
x: 1111111111
y: 0011001111
tile: 00000001
x
正确 (1111111111 = 1023),y
错误 (0011001111 = 207,而不是 1023),瓦片正确 (00000001 = 1)
我很困惑,显然遗漏了一些东西。
按此顺序查看更有意义:(这将是 n
的二进制表示)
00000001 00111111 11110011 11111111
按此顺序,您可以轻松地进行视觉遮蔽和移动。
你所做的问题是,例如在11111111 11110011
中,属于第一个字段的第二个字节的位在右边(该字节的最低部分),按该顺序是不连续的。
此外,使用 0x03FF
进行掩码使得前两个字段有 10 位,其中两位刚刚消失。您可以通过使用 0x0FFF
掩码使它们成为 12 位。就像现在一样,您实际上有两个填充位。