【问题标题】:How write big endian ByteBuffer to little endian in Java如何在 Java 中将大端字节缓冲区写入小端
【发布时间】:2026-01-10 03:50:01
【问题描述】:

我目前有一个 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”到小端缓冲区.我想有更好的方法......

【问题讨论】:

标签: java bytebuffer endianness


【解决方案1】:

字节序对字节[] 没有意义。 Endianess 仅对多字节数据类型(如 short、int、long、float 或 double)有意义。获得正确字节序的正确时间是当您将原始数据写入字节并读取实际格式时。

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

【讨论】:

    【解决方案2】:

    以下是我解决类似问题的方法,希望得到正确写入输出文件的整数的“字节顺序”:

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

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

    【讨论】: