【问题标题】:32-bit int struct bits don't seem to match up (nodejs)32 位 int 结构位似乎不匹配(nodejs)
【发布时间】:2017-06-21 23:33:48
【问题描述】:

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

   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 字节中。

尽管xy 使用12 位,但它们的最大值是1023,因此它们可以用10 位表示。这取决于格式的创建者。我猜他们只是在填充东西,以便他们可以为每个图块使用 32 位整数?无论哪种方式,对于xy,我们都可以忽略最后两位。

我正在使用 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

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

我很困惑,显然错过了什么。

【问题讨论】:

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


    【解决方案1】:

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

    00000001 00111111 11110011 11111111
    

    按此顺序,您可以轻松地进行视觉遮罩和移位。

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

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

    【讨论】:

    • 我不明白为什么这些位会在右边。最低的部分是什么意思?
    • @samstr 因为这是我们通常写数字的方式,右边是最低权重的数字,左边是最重要的数字。如果您以相反的方式打印字节中的位,那么以您的字节顺序再次有意义。但是不同顺序的组合(右边是最低位,左边是最低字节)真的很尴尬。
    • 谢谢!当您向我展示00000001 00111111 11110011 11111111 订单(n 的二进制表示)时,点击了某些东西。 console.log(tileBuffer.readUInt32LE(0).toString(2)); // 1001111111111001111111111 需要一些填充,但我可以使用它。再次感谢!
    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2020-02-15
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多