当前位置: 首页 > 面试题库 >

在Java中将字节数组转换为整数,反之亦然

姜磊
2023-03-14
问题内容

我想将一些数据存储到Java中的字节数组中。基本上只是数字,每个数字最多占用2个字节。

我想知道如何将整数转换为2字节长的字节数组,反之亦然。我发现有很多解决方案在使用Google搜索,但是大多数解决方案没有解释代码中会发生什么。我真的不了解很多变化的东西,所以我希望能得到一个基本的解释。


问题答案:
byte[] toByteArray(int value) {
     return  ByteBuffer.allocate(4).putInt(value).array();
}

byte[] toByteArray(int value) {
    return new byte[] { 
        (byte)(value >> 24),
        (byte)(value >> 16),
        (byte)(value >> 8),
        (byte)value };
}

int fromByteArray(byte[] bytes) {
     return ByteBuffer.wrap(bytes).getInt();
}
// packing an array of 4 bytes to an int, big endian, minimal parentheses
// operator precedence: <<, &, | 
// when operators of equal precedence (here bitwise OR) appear in the same expression, they are evaluated from left to right
int fromByteArray(byte[] bytes) {
     return bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF);
}

// packing an array of 4 bytes to an int, big endian, clean code
int fromByteArray(byte[] bytes) {
     return ((bytes[0] & 0xFF) << 24) | 
            ((bytes[1] & 0xFF) << 16) | 
            ((bytes[2] & 0xFF) << 8 ) | 
            ((bytes[3] & 0xFF) << 0 );
}

将带符号的字节打包为一个int时,每个字节都需要屏蔽掉,因为由于算术提升规则(在JLS,转换和提升中所述),它被符号扩展为32位(而不是零扩展)。

Joshua Bloch和Neal Gafter在Java Puzzlers(“每个字节都有很大的乐趣”)中描述了一个与此有关的有趣难题。在将字节值与int值进行比较时,将字节符号扩展为int,然后将该值与另一个int进行比较

byte[] bytes = (…)
if (bytes[0] == 0xFF) {
   // dead code, bytes[0] is in the range [-128,127] and thus never equal to 255
}

请注意,所有数字类型都用Java签名,但char是16位无符号整数类型。



 类似资料:
  • 问题内容: 我发现了将文件转换为字节数组并将字节数组写入存储中文件的多种方法。 我想要的是转换为字节数组,然后将字节数组转换回。 我不想像以下那样将其写出到存储中: 我想以某种方式执行以下操作: 问题答案: 我认为您误解了班级的真正含义。它只是系统上文件的表示,即文件名,路径等。 您甚至看过该课程的Javadoc 吗?在这里看看, 如果检查它具有的字段或方法或构造函数参数,您会立即得到暗示,它只是

  • 问题内容: 我正在尝试通过android将图像作为字节数组发送,并在服务器端将其转换回png文件,我正在服务器端。 这是我的android代码,它将图像转换为字节数组并将其作为请求发送到服务器: 这是我的服务器端程序: 服务器上的异常是: 问题答案: 您将图像写入客户端的文件输出流,该流会将内容存储到物理文件中。然后,您尝试将的表示形式转换为图像内容。这是行不通的,该类的方法不会为您提供写入流中的

  • 问题内容: 我必须在Android中将字节数组转换为字符串,但是我的字节数组包含负值。 如果我再次将该字符串转换为字节数组,则得到的值与原始字节数组值不同。 我该怎么做才能正确转换?我用于执行转换的代码如下: 我陷入了这个问题。 问题答案: 你的字节数组必须具有某种编码。如果你使用负值,则编码不能为ASCII。一旦弄清楚了,就可以使用以下方法将一组字节转换为字符串: 你可以使用许多编码,请查看Su

  • 问题内容: 我正在尝试将a 转换为原始类型,反之亦然: 奇怪的是,当我尝试将新分配的分配回a时,结果不过是垃圾。 但是,当我使用原始数据类型作为参数时,似乎相同的算法工作得很好。 问题答案: 改用这些。

  • 问题内容: 我想要获得一个角色的价值。 例如,对于角色,我要获取,反之亦然。 问题答案: 使用和:

  • 问题内容: 我正在寻找一种将NumPy数组传递给Matlab的方法。 我已经设法通过使用将数组存储到图像中,然后使用加载它来做到这一点,但这当然会使矩阵包含0到256之间的值,而不是“真实”值。 将这个矩阵的乘积除以256,再加上原始NumPy数组中的最大值,可以得出正确的矩阵,但是我觉得这有点乏味。 有没有更简单的方法? 问题答案: 当然,只要使用 举个例子: 同样,有。 然后,您使用将其加载到