3

我根本没有 PHP 编码经验。但是在为我的 Java 项目寻找解决方案时,我发现了一个 PHP 中的问题示例,这对我来说很陌生。

谁能解释一下unpack('N*',"string")PHP功能的工作和结果以及如何在Java中实现它?

一个例子对我有很大帮助!

谢谢!

4

1 回答 1

5

在 PHP中(以及在 Perl中,PHP 从中复制了它),unpack("N*", ...)接受一个字符串(实际上表示一个字节序列)并将它的每个 4 字节段解析为有符号的 32 位大端(“网络字节顺序” ) 整数,以数组的形式返回它们。

在 Java 中有几种方法可以做到这一点,但一种方法是将输入字节数组包装在 a 中java.nio.ByteBuffer,将其转换为 an IntBuffer,然后从中读取整数:

public static int[] unpackNStar ( byte[] bytes ) {
    // first, wrap the input array in a ByteBuffer:
    ByteBuffer byteBuf = ByteBuffer.wrap( bytes );

    // then turn it into an IntBuffer, using big-endian ("Network") byte order:
    byteBuf.order( ByteOrder.BIG_ENDIAN );
    IntBuffer intBuf = byteBuf.asIntBuffer();

    // finally, dump the contents of the IntBuffer into an array
    int[] integers = new int[ intBuf.remaining() ];
    intBuf.get( integers );
    return integers;
}

当然,如果您只想遍历整数,则不需要IntBufferor 数组:

ByteBuffer buf = ButeBuffer.wrap( bytes );
buf.order( ByteOrder.BIG_ENDIAN );

while ( buf.hasRemaining() ) {
    int num = buf.getInt();
    // do something with num...
}

事实上,迭代这样的对象是一种方便的方式来模拟Perl 或 PHP 中ByteBuffer更复杂示例的行为。unpack()

免责声明:我没有测试过这段代码。我相信它应该可以工作,但我总是有可能打错或误解了一些东西。请在使用前测试。

Ps. If you're reading the bytes from an input stream, you could also wrap it in a DataInputStream and use its readInt() method. Of course, it's also possible to use a ByteArrayInputStream to read the input from a byte array, achieving the same results as the ByteBuffer examples above.

于 2013-03-20T17:41:42.283 回答