将int数组转换为byte数组或者将byte数组转换为int数组,最高效的方法是什么?

4
我正在寻找将int数组转换为byte数组以及反向转换的最有效方法。
我想要将大量的int数组和字符串写入文件,以便能够高效地读取它们。我认为节省空间并减少读取时间的最佳方式是将它们存储为byte。我正确吗?
我阅读了下面的链接,但是否有更好的方法? Convert integer into byte array (Java)

1
所有的值都在范围[-128, 127]内吗? - Jon Skeet
1
@Jon Skeet; 是的。如果不在那个范围内,这会造成问题吗? - user3487667
1
好的,那么你需要想出如何存储它们。我假设你想每个int存储一个字节,如果它们都在这个范围内... - Jon Skeet
4个回答

4

整数转字节

直接通过位移操作来转换字节/位是最好的方法,也是最有效的方法。

你可能需要循环调用链接中提到的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]));
}

还可以看看


int存储为4个byte并不能节省空间效率(两种解决方案都是32位)。我相信OP想要将他的int存储为单个byte以节省空间。无论如何,你的解决方案是执行转换的最有效方式,而且不会丢失数据。 - Luke Willis
@LukeWillis 谢谢,没错,这可能是最有效的方法,而且不会有数据丢失,但我不确定为什么有人想要将整数保存为(单个!)字节.. ;) (如果您只有-127到128,可以直接将它们保存为字节) - flotothemoon
@1337索引是一个例子,它更喜欢存储一个字节而不是4个字节,因为可以节省空间。这也是我想将_int_数组转换为_byte_数组的原因之一。 - user3487667
@user3487667 嗯.. 是的,可能吧。有趣,谢谢 :) - flotothemoon
@flotothemoon 我相信读取字节应该是 bytes[4i],bytes[4i+1] 等等 - Alessandro Teruzzi

2
关于效率,要写入和读取的文件大小将决定使用哪种方法。您可能需要运行一些时间测试来确定哪种方法最适合您所做的工作。
另一个选项(适用于较小的文件)是利用Files.readAllBytes()Files.write()

2
在Java中,一个字节(byte)是8位,而一个整数(int)是32位。
为了将每个int转换为单个byte 不会丢失数据,你需要确保所有的数字都在-128到127的范围内。如果它们在这个范围内,则应该一开始就将它们存储为byte(如果不可能,已经讨论过如何进行转换)。如果它们不在这个范围内,那么你根本不应该将它们转换为byte,因为这样会强制你的数字进入这个范围,因此你将失去大量数据。或者,你可以使用short,因为它是16位(给你的范围是-32768到32767)。但是,如果你无法确保你的数字将在这些范围内,那么你将需要使用int
注意:你可以将每个int存储为4个byte或2个short,但每个数字仍然是32位,所以这样做并没有提高空间效率。
请参阅这里了解更多有关Java原始类型的信息。

1

我怀疑这比自己移位字节更有效率.. ;) - flotothemoon
关于序列化,我尝试了因为头文件和...从文件读取不够高效。 - user3487667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接