3

PHPでのコーディング経験はまったくありません。しかし、私のJavaプロジェクトの解決策を探しているときに、PHPの問題の例を見つけました。これは、偶然にも私には関係ありません。

unpack('N*',"string")PHPの機能の動作と結果、およびJavaでの実装方法を誰かに説明してもらえますか?

例は私に大いに役立ちます!

ありがとう!

4

1 に答える 1

5

PHP (およびPHP のコピー元であるPerlunpack("N*", ...) ) では、文字列 (実際には一連のバイトを表す) を取得し、その各 4 バイト セグメントを符号付き 32 ビット ビッグ エンディアン (「ネットワーク バイト オーダー」) として解析します。 ) 整数、それらを配列で返します。

Java で同じことを行う方法はいくつかありますが、1 つの方法は、入力バイト配列を でラップし、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...
}

実際、このような反復処理は、Perl や PHPByteBufferのさらに複雑な例の動作をエミュレートする便利な方法です。unpack()

(免責事項: このコードはテストしていません。動作するはずですが、入力ミスや誤解がある可能性は常にあります。使用する前にテストしてください。 )

Ps。DataInputStream入力ストリームからバイトを読み取る場合は、それを でラップしてそのreadInt()メソッドを使用することもできます。もちろん、 a を使用してバイト配列から入力を読み取ることも可能で、上記の例ByteArrayInputStreamと同じ結果が得られます。ByteBuffer

于 2013-03-20T17:41:42.283 に答える