【问题标题】:Converting byte array to int array in Java, via ByteBuffer to IntBuffer, without truncating在Java中将字节数组转换为int数组,通过ByteBuffer到IntBuffer,而不截断
【发布时间】:2015-10-26 17:04:37
【问题描述】:

这里还有其他关于这个主题的问题,其中大部分涉及ByteBufferasIntBuffer。但是,我没有看到任何关于在转换为IntBuffer 时如何防止值被截断的解释。

例子:

byte[] plainTextBytes = "Hello World".getBytes();

// Truncates the limit from 11 to 2
IntBuffer intBuffer = ByteBuffer.wrap( plainTextBytes ).asIntBuffer();

// Results in java.lang.UnsupportedOperationException
int[] plainTextInt = intBuffer.array();

我有一个 RC4 加密算法,它采用int[] 类型的明文参数。因此,我需要将明文转换为int[]ByteBuffer 和使用 asIntBuffer 的问题是明文被截断,因为限制是独立的(在我的示例中,从 11 变为 2)。

要么我做错了,要么ByteBuffer 不是这里的路。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 听起来你需要填充。
  • 问题是java中的int大小是4bytes。您的字节缓冲区包含 11 个字节。这是一个完整的 2 int(8bytes)。你绝对需要使用字节缓冲区吗?其他解决方案可能对您有用,例如直接将字节数组用作整数。
  • 不,一点也不。我不需要使用字节缓冲区。但是 StackOverFlow 上的大多数答案都指向字节缓冲区。我对任何将字节数组转换为 int 数组的解决方案持开放态度。谢谢。

标签: java arrays int bytearray bytebuffer


【解决方案1】:

你好,如果你不需要使用 IntBuffer,你可以试试这个。

byte[] plainTextBytes = "Hello World".getBytes();

int[] ints = new int[plainTextBytes.length];

for(int i = 0; i < ints.length; i++){
    ints[i] = plainTextBytes[i];
}

您基本上将字节直接转换为整数。

【讨论】:

  • 非常感谢!这应该有效。不确定字节缓冲区的意义是什么,如果它只是在从它转换为 int 缓冲区时被截断。我不知道为什么你的回答被否决了。我刚试过,它似乎工作。我唯一要改变的是在 for 循环内,我认为它应该是ints[i] = plainTextBytes[i] &amp; 0xFF,以保持范围在 0-255 之间。再次感谢。
  • 这是要走的路+1
【解决方案2】:

使用Buffer#array 不适合您的需求。文档说

返回支持此缓冲区的字节数组(可选操作)。

投掷:
ReadOnlyBufferException - 如果此缓冲区由数组支持但为只读
UnsupportedOperationException - 如果此缓冲区不受可访问数组的支持

您在代码中使用了两个缓冲区。第一个是ByteBuffer,它包装了一个数组。因此,这个 Buffer 由一个数组支持,并且对 #array() 的调用是有效的。您通过#asIntBuffer() 创建的第二个。这个缓冲区只是第一个缓冲区的视图,它没有由数组支持。所以你在调用array()时会看到UnsupportedOperationException

您想加密byte[],但您的算法适用于int[]。那么 Jawad 的答案就是你要走的路。

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2015-04-28
    • 2017-08-22
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多