8

私は現在、ビッグエンディアン形式のデータをすでに持っているJavaByteBufferを持っています。次に、リトルエンディアンとしてバイナリファイルに書き込みます。

まだビッグエンディアンでファイルを書き込むコードは次のとおりです。

 public void writeBinFile(String fileName, boolean append) throws FileNotFoundException, IOException
 {
     FileOutputStream outStream = null;
     try
     {
         outStream = new FileOutputStream(fileName, append);
         FileChannel out = outStream.getChannel();
         byteBuff.position(byteBuff.capacity());
         byteBuff.flip();
         byteBuff.order(ByteOrder.LITTLE_ENDIAN);
         out.write(byteBuff);
     }
     finally
     {
         if (outStream != null)
         {
            outStream.close();
         }
     }

 }

byteBuffは、ビッグエンディアン形式で入力されたByteBufferであることに注意してください。

私の最後の手段は、別のバッファーを作成し、そのByteBufferをリトルエンディアンに設定してから、元の(ビッグエンディアン)バッファーから「getInt」値を読み取り、値をリトルエンディアンバッファーに「setInt」するブルートフォース方式です。もっと良い方法があると思います...

4

2 に答える 2

9

エンディアンはbyte[]には意味がありません。エンディアンは、short、int、long、float、doubleなどのマルチバイトデータ型でのみ重要です。エンディアンを正しく取得する適切なタイミングは、生データをバイトに書き込み、実際のフォーマットを読み取るときです。

byte []が指定されている場合は、元のデータ型をデコードし、異なるエンディアンで再エンコードする必要があります。これはa)簡単ではない、または理想的b)自動的に行うことはできないことに同意していただけると思います。

于 2013-01-24T09:32:33.910 に答える
3

出力ファイルに書き込んでいる整数の「エンディアン」を正しく取得したいので、同様の問題をどのように解決したかを次に示します。

byte[] theBytes = /* obtain a byte array that is the input */
ByteBuffer byteBuffer = ByteBuffer.wrap(theBytes);

ByteBuffer destByteBuffer = ByteBuffer.allocate(theBytes.length);
destByteBuffer.order(ByteOrder.LITTLE_ENDIAN);
IntBuffer destBuffer = destByteBuffer.asIntBuffer();

while (byteBuffer.hasRemaining())
{
    int element = byteBuffer.getInt();

    destBuffer.put(element);

    /* Could write destBuffer int-by-int here, or outside this loop */
}

これを行うにはもっと効率的な方法があるかもしれませんが、私の特定の問題では、要素を新しいバッファーにコピーするときに、要素に数学変換を適用する必要がありました。しかし、これはあなたの特定の問題に対してはまだ機能するはずです。

于 2013-08-21T14:58:19.087 に答える