我根本没有PHP的编码经验.但是在寻找我的Java项目的解决方案时,我在PHP中找到了一个问题的例子,这对我来说是偶然的.
任何人都可以解释PHP的解包(‘N *’,“字符串”)函数的工作和结果以及如何在Java中实现它?
一个例子对我帮助很大!
谢谢!
解决方法:
In PHP(和in Perl,PHP复制它),unpack(“N *”,…)接受一个字符串(实际上表示一个字节序列)并将其每个4字节段解析为带符号的32位大-endian(“网络字节顺序”)整数,将它们返回到数组中.
在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()示例的行为.
(免责声明:我没有测试过这段代码.我相信它应该可行,但我总是可能输入错误或误解了.请在使用前进行测试.)
PS.如果您正在读取输入流中的字节,您还可以将其包装在DataInputStream
中并使用其readInt()
方法.当然,也可以使用ByteArrayInputStream
从字节数组中读取输入,从而获得与上面的ByteBuffer示例相同的结果.