Java 根据奇怪的协议将整数放入字节数组

Java 根据奇怪的协议将整数放入字节数组,java,bytearray,minecraft,bukkit,Java,Bytearray,Minecraft,Bukkit,我正在构造一个字节数组,其中包含有关已更改块的数据 我有整数x,y,z和blockID,blockMeta: Bit mask Width Meaning 00 00 00 0F 4 bits Block metadata 00 00 FF F0 12 bits Block ID 00 FF 00 00 8 bits Y co-ordinate 0F 00 00 00 4 bits Z co-ordinate, relative to c

我正在构造一个字节数组,其中包含有关已更改块的数据

我有整数
x
y
z
blockID
blockMeta

Bit mask       Width    Meaning 
00 00 00 0F    4 bits   Block metadata
00 00 FF F0    12 bits  Block ID
00 FF 00 00    8 bits   Y co-ordinate
0F 00 00 00    4 bits   Z co-ordinate, relative to chunk so can fit
F0 00 00 00    4 bits   X co-ordinate, relative to chunk so can fit
如何将整数放入数组?
如果这是一个问题,我可以放心地假设整数将“适合”

到目前为止,我得到的是:

byte[] data = new byte[blocks.length * 4];
for (int i = 0; i < blocks.length; i++) {
    int j = i * 4;
    int blockX = blocks[i].getBlockX() - (chunk.getX() * 16);
    int blockY = blocks[i].getBlockY();
    int blockZ = blocks[i].getBlockZ() - (chunk.getZ() * 16);
    int blockID = material.getId();
    int blockMeta = 0;
    // data[j] = // Help!
    // data[j + 1] = //Help!

    // data[j + 2] = //Help!
    // data[j + 3] = //Help!
}
byte[]data=新字节[blocks.length*4];
对于(int i=0;i
试试这个:

byte[] finalMessage = ByteBuffer.allocate(20).putInt(x).putInt(y).putInt(z).putInt(blockID).putInt(blockMeta).array();
    int[] data = new int[blocks.length];
for (int i = 0; i < blocks.length; i ++) {
    int blockX = blocks[i].getBlockX() << 28;
    int blockY = blocks[i].getBlockY() << 16;
    int blockZ = blocks[i].getBlockZ() << 24;
    int blockID = material.getId() << 4;
    int blockMeta = 0;
    int result = blockX | blockY | blockZ | blockID | blockMeta;
    data[i] = result;
}

这应该能奏效

byte[] finalMessage = ByteBuffer.allocate(4).putInt( (blockX << 28) | (blockZ << 24) | (blockY << 16) | (blockID << 4) | blockMeta ).array();
byte[]finalMessage=ByteBuffer.allocate(4.putInt)((blockX尝试以下操作:

byte[] finalMessage = ByteBuffer.allocate(20).putInt(x).putInt(y).putInt(z).putInt(blockID).putInt(blockMeta).array();
    int[] data = new int[blocks.length];
for (int i = 0; i < blocks.length; i ++) {
    int blockX = blocks[i].getBlockX() << 28;
    int blockY = blocks[i].getBlockY() << 16;
    int blockZ = blocks[i].getBlockZ() << 24;
    int blockID = material.getId() << 4;
    int blockMeta = 0;
    int result = blockX | blockY | blockZ | blockID | blockMeta;
    data[i] = result;
}
int[]数据=新的int[blocks.length];
对于(int i=0;iint blockX=blocks[i].getBlockX()你有没有尝试过编写代码来实现这一点?如果有,请在这里发布。位掩码是你的朋友。尽管我尝试了几个小时,但我认为我没有写任何有价值的东西。wile@hofan41创建5
ByteBuffer
s似乎是非常浪费的。为什么不在一个
ByteBuffer
中完成这一切?为什么这符合协议?根据一个协议,我更新了问题-对不起。这不应该是相反的,所以j会转到j+3等吗?这取决于你的位掩码的尾数。它是读msb->lsb还是lsb->msb?我更新了我的答案以使用ByteBuffer,因为你使用这个位掩码所做的只是将几个整数压缩成一个整数(即4字节)干杯-我想我必须反转它,因为我认为这是错误的endian。我得到了不兼容的类型:Required:byte-find:int