当前位置: 首页 > 知识库问答 >
问题:

如何在Java中将big-endian ByteBuffer写入little-endian

东门佐
2023-03-14

我目前有一个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设置为little endian,然后从原始(big endian)缓冲区读取“getInt”值,并将“setInt”值设置为little endian缓冲区。我想有更好的方法。。。

共有2个答案

单于承
2023-03-14

下面是我如何解决一个类似的问题,想要获得我正在写入输出文件的整数的“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 */
}

可能有更有效的方法来实现这一点,但是对于我的特殊问题,我必须在将元素复制到新缓冲区时对它们进行数学转换。但是这应该仍然适用于你的特殊问题。

东郭兴学
2023-03-14

Endianess对于字节[]没有任何意义。Endianess只适用于多字节数据类型,如短、整数、长、浮点或双。正确获取endianess的正确时间是将原始数据写入字节并读取实际格式的时候。

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

 类似资料:
  • 问题内容: 所有, 我一直在网上练习编码问题。目前,我正在研究问题陈述“ 问题”,我们需要在其中转换大尾数<->小尾数。但是考虑到给出的示例,我无法记下步骤: 我正在考虑的逻辑是: 1>获取整数值(由于我在Windows x86上,输入为Little Endian) 2>生成相同的十六进制表示形式。 3>反转表示并生成大端整数 但是我显然在这里缺少一些东西。 谁能指导我。我正在用Java 1.5编

  • 问题内容: 我能够将其转换为无符号整数: 这利用了Go包https://golang.org/src/encoding/binary/binary.go中的BigEndian和LittleEndian类型。 这提供了,但是没有等效项或 有什么想法为什么不呢?另外,应该怎么做呢? 问题答案: 将数字类型转换为一系列字节(),反之亦然,这与字节序有关。您如何解释结果完全取决于您。 您所需要做的就是汇编

  • 问题内容: 我想发送多个随机值。我认为数组是发送它们的最佳方法。但是我不知道如何向Socket写一个数组? 我的Java课: 导入java.io.ByteArrayOutputStream; 导入java.io.IOException; 导入java.io.InputStream; 导入java.net.Socket; 导入java.io. *; 导入java.util.Random; 问题答案:

  • 我正在使用具有Big-Endian字节顺序格式的Java将字节数组值写入文件中。。现在我需要从C程序中读取该文件。。。 我正在写入文件的字节数组由三个字节数组组成,如下所述- 我正在将、和一起写入一个单字节数组,并将生成的字节数组写入一个文件,然后我将使用我的C程序从文件中检索该字节数组数据,然后反序列化以提取,和它的。 下面是我的工作Java代码,它将字节数组值写入大端格式的文件: 现在,我需要

  • 我正在使用Spark 2.3,我需要将Spark数据帧保存到csv文件中,我正在寻找更好的方法。。查看相关/类似的问题,我发现了这个问题,但我需要一个更具体的: 如果DataFrame太大,如何避免使用Pandas?因为我使用了函数(下面的代码),它产生了: 内存不足错误(无法分配内存)。 使用文件I/O直接写入csv是更好的方法吗?它可以保留分隔符吗? 使用df。聚结(1)。写选项(“标题”、“

  • 我正在将JSON插入Google Big Query中。问题的底部是JSON的模式。 下面是一个JSON示例: 如您所见,有一个“_source.fullname”字段带有“Mike Smith”。 当我试图用它创建表时,它出错了: 为非重复字段指定的数组:_source.fullname。 我相信这个字段是_source的一次性字段。我如何克服这个错误? 下面是模式: