2013-01-24 34 views
5

現在Big Endian形式のデータを持つJava ByteBufferがあります。私はリトルエンディアンとしてバイナリファイルに書きたいと思っています。 byteBuffはビッグエンディアン形式に充填されたByteBufferのであることをビッグエンディアンByteBufferをJavaのリトルエンディアンに書き込む方法

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(); 
     } 
    } 

} 

注:

はここだけのビッグエンディアンで、まだファイルを書き込むコードです。

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

+1

Apacheコモンズ(http://commons.apache.org/io/api-release/org/apache/commons/io/EndianUtils.html)を試しましたか? –

+0

+1 Apache Commonsの場合:ホイールを改造しないでください:) – BachT

答えて

4

エンディアンはバイト[]に対して意味を持ちません。エンディアンは、short、int、long、float、doubleのようなマルチバイトデータ型の場合にのみ重要です。エンドエンティティを正しく取得する適切なタイミングは、生のデータをバイトに書き込み、実際のフォーマットを読み取るときです。

バイト[]がある場合、元のデータ型をデコードし、異なるエンディアンで再エンコードする必要があります。私はあなたがこれに同意すると確信しています)a)簡単ではないか理想的ではありません。b)自動で行うことはできません。ここで

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 */ 
} 

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

関連する問題