如何在Java中将大端字节ByteBuffer写入小端

时间:2013-01-24 08:30:19

标签: java bytebuffer endianness

我目前有一个已经拥有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是一个以Big Endian格式填充的ByteBuffer。

我的最后一种方法是创建另一个缓冲区并将ByteBuffer设置为little endian然后从原始(big endian)缓冲区读取“getInt”值,并将“setInt”值设置为little endian缓冲区的强力方法。我想有更好的方法......

2 个答案:

答案 0 :(得分:5)

Endianess对于byte []没有意义。 Endianess仅适用于多字节数据类型,如short,int,long,float或double。获得正确结束的正确时间是将原始数据写入字节并读取实际格式。

如果您有一个byte [],则必须解码原始数据类型并使用不同的字节序重新编码它们。我相信你会同意这是a)不容易做或理想b)不能自动完成。

答案 1 :(得分:3)

以下是我解决类似问题的方法,希望得到我正在写入输出文件的Integers的“endianness”:

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

可能有更有效的方法来做到这一点,但对于我的特定问题,我必须对元素应用数学变换,因为我将它们复制到新缓冲区。但这应该仍适用于您的特定问题。