8

我目前有一个 Java ByteBuffer,它已经拥有 Big Endian 格式的数据。然后我想以 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 设置为小端,然后从原始(大端)缓冲区读取“getInt”值,并将值“setInt”到小端缓冲区的蛮力方法。我想有更好的方法...

4

2 回答 2

9

Endianess 对 byte[] 没有意义。Endianess 仅对多字节数据类型(如 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 回答