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

我根本没有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示例相同的结果.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...