我根本没有PHP的编码经验。但是在寻找我的Java项目的解决方案时,我在PHP中找到了一个问题的例子,这对我来说是偶然的。
任何人都可以解释PHP的unpack('N*',"string")
功能的工作和结果以及如何在Java中实现它?
一个例子对我有很大的帮助!
谢谢!
答案 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
示例相同的结果。