32位的int结构位似乎不匹配(nodejs)

时间:2017-02-04 18:16:41

标签: binary bit-manipulation bitwise-operators bit bit-masks

我有一个文件定义了一组图块(在在线游戏中使用)。每个磁贴的格式如下:

   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位。即。 x以1.5个字节存储,y以1.5个字节存储,tile以1个字节存储。

即使xy使用12位,其最大值为1023,因此它们可以用10位表示。这取决于格式的创建者。我猜他们只是填充了东西,所以他们可以为每个瓷砖使用32位整数?无论哪种方式,对于xy,我们都可以忽略最后的2位。

我使用nodejs Buffer读取文件,我使用以下代码读取值。

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

在地图编辑器中创建切片并将生成的文件读入缓冲区会返回<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)

我很困惑,显然遗失了什么。

1 个答案:

答案 0 :(得分:1)

以这个顺序查看它更有意义:(这将是n的二进制表示)

00000001 00111111 11110011 11111111

在该订单上,您可以轻松地进行屏蔽和视觉转换。

您所做的问题是,例如在11111111 11110011中,属于第一个字段的第二个字节的位位于 right (该字节的最低部分) ),按顺序是不连续的。

此外,使用0x03FF进行屏蔽会使前两个字段具有10位,其中两位正在消失。您可以通过使用0x0FFF进行屏蔽来使它们成为12位。就像现在一样,你实际上有两个填充位。