如何在Java中将大端字节缓冲区转换为小端?

8

我目前有一个以Big Endian格式存储数据的Java ByteBuffer。我想将其作为Little Endian写入二进制文件。

以下是仍然采用Big Endian编写文件的代码:

 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”到小端序缓冲区中。我想应该有更好的方法...

1
你尝试过使用Apache Commons (http://commons.apache.org/io/api-release/org/apache/commons/io/EndianUtils.html) 吗? - Dominik Sandjaja
+1 for Apache Commons:不要重复造轮子 :) - BachT
2个回答

9
字节(byte[])的大小端无意义。大小端只与短整型、整型、长整型、浮点型或双精度浮点型等多字节数据类型有关。在将原始数据写入字节并读取实际格式时,正确确定大小端很重要。
如果你手头有一个字节数组(byte[]),你必须解码原始数据类型并使用不同的大小端重新编码它们。我相信你会同意这样做既不容易也不理想,也不能自动完成。

4

以下是我解决类似问题的方法,想要正确获取我写入输出文件的整数的“字节序”:

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

可能有更高效的方法来完成这个任务,但是对于我的特定问题,我不得不在将元素复制到新缓冲区时对它们应用数学变换。但是这仍然可以解决您的特定问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接