【问题标题】:What is the most efficient way to convert array of int to array of byte and vice versa?将 int 数组转换为 byte 数组的最有效方法是什么,反之亦然?
【发布时间】:2014-09-23 14:35:08
【问题描述】:

我正在寻找将int 数组转换为byte 数组的最有效方法,反之亦然。

我想将大量 int 数组和字符串写入文件,以便我可以有效地读取它们。我认为节省空间和减少阅读时间的最佳方法是将它们存储为byte我说的对吗?

我阅读了以下链接,但有没有更好的方法?

Convert integer into byte array (Java)

【问题讨论】:

  • 那么[-128, 127]范围内的所有值吗?
  • @Jon Skeet;是的。如果不在那个范围内,这会导致问题吗?
  • 嗯,是的,你需要弄清楚你想如何存储它们。我假设你想为每个 int 存储一个字节,如果它们都在那个范围内......

标签: java arrays file-io int byte


【解决方案1】:

整数到字节

我认为没有比直接移动字节/位更好或更有效的方法了。

您可能需要遍历您链接的question 中提到的 toBytes(..) 方法:

byte[] toBytes(int i)
{
  byte[] result = new byte[4];

  result[0] = (byte) (i >> 24);
  result[1] = (byte) (i >> 16);
  result[2] = (byte) (i >> 8);
  result[3] = (byte) (i /*>> 0*/);

  return result;
}

像这样:

for (int i = 0; i < integers.length; i++)
{
   bytes[i] = toBytes(integers[i]);
}

字节转整数

对于字节到整数,您可以进行简单的乘法和加法,这可能是最快的。比如:

for (int i = 0; i < integers.length; i++)
{
   integers[i] = ((int) (bytes[i] << 24)) + ((int) (bytes[i+1] << 16)) + ((int) (bytes[i + 2] << 8)) + ((int) (bytes[i + 3]));
}

另见

【讨论】:

  • ints 存储为 4 bytes 不会节省任何空间效率(两种解决方案都是 32 位)。我相信 OP 是在询问将他的 ints 存储为单个 bytes 以节省空间。无论如何,您的解决方案是执行转换不丢失数据的最有效方式。
  • @LukeWillis 谢谢,是的,你是对的,这可能是不丢失数据的最有效方法,但我不确定为什么有人想要将整数保存为(单个!)字节.. ;)(如果您只有 -127 到 128,您可以立即将它们保存为字节)
  • @1337 索引是一个示例,由于节省空间,它更喜欢存储一个字节而不是 4 个字节。这也是我想将 int 数组转换为 byte 数组的原因。
  • @user3487667 嗯.. 可能。有趣,谢谢:)
【解决方案2】:

在 Java 中,byte 是 8 位,而 int 是 32 位。

要将您的每个 ints 转换为单个 byte而不丢失数据,您需要确保所有数字都在 -128 到 127 的范围内。

如果它们在这个范围内,那么你应该首先将它们存储为字节(如果这不可能,有办法进行转换已经讨论过了)。

如果它们不在此范围内,那么您根本不应该将它们转换为字节,因为它会强制您的数字进入该范围,因此您将丢失大量数据。

或者,您可以使用short,因为那将是 16 位(给您的范围是 -32,768 到 32,767(含)。

但如果您不能确保您的号码在这些范围内,那么您将需要使用int


注意:您可以将每个 int 存储为 4 个 bytes 或 2 个 shorts,但每个数字仍然是 32 位,因此您不会获得任何空间这样做的效率。


You can read more about Java's primitive types here.

【讨论】:

    【解决方案3】:

    关于效率,要写入和读取的文件的大小将决定使用哪种方法。您可能需要简单地运行一些定时测试,看看哪种方法最适合您正在做的事情。

    另一个选项(对于较小的文件)是使用Files.readAllBytes()Files.write()

    【讨论】:

      【解决方案4】:

      Java 提供了一个 API,可以更有效地为您执行此操作。看http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html。此外,如果您不想使用其他应用程序打开文件,另一个有效的解决方案是使用http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html,它将序列化整个对象,而无需手动转换它。

      另外,检查这个答案:Fastest way to write an array of integers to a file in Java?

      【讨论】:

      • 我怀疑这比自己移动字节更有效.. ;)
      • 关于序列化,我试过因为头文件,而且,...从文件中读取效率不高。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多