如何在Java中用类似的方法转换php unpack()

时间:2013-03-20 16:55:41

标签: java php

我根本没有PHP的编码经验。但是在寻找我的Java项目的解决方案时,我在PHP中找到了一个问题的例子,这对我来说是偶然的。

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

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

谢谢!

1 个答案:

答案 0 :(得分:5)

In PHP(和in Perl,其中,PHP复制它从),unpack("N*", ...)采用一个字符串(实际上表示字节序列),并解析它的各4字节的链段作为签名的32位big-endian(“ N etwork byte order”)整数,将它们返回一个数组。

有几种方法可以做到在Java中是相同的,但一个方法是将包输入字节阵列中的java.nio.ByteBuffer,将其转换为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;
}

当然,如果你只是想迭代整数,你真的不需要IntBuffer或数组:

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

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

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

免责声明:。我没有测试此代码,我认为它应该工作,但它总是可能的,我可能错误或误解的东西请在使用前进行测试的)

聚苯乙烯。如果您正在从输入流中读取字节,则还可以将其包装在DataInputStream中并使用其readInt()方法。当然,也可以使用ByteArrayInputStream来读取字节数组中的输入,从而获得与上面ByteBuffer示例相同的结果。