【问题标题】:Convert 32bit binary string to byte将 32 位二进制字符串转换为字节
【发布时间】:2019-03-14 16:59:57
【问题描述】:

我使用 FileInputStream 一次读取一个字节,然后使用 Integer.toBinaryString() 将其转换为字符串,稍后需要将其转换回一个字节。

这是我的问题:java 使用 32 位字节,这意味着 Integer.toBinaryString() 返回的字符串的长度为 32,我在尝试将其转换回字节时感到非常沮丧,因为像 Byte 这样的方法.valueOf() 等等,都会抛出与值超出字节范围有关的错误。

我错过了什么吗?还是我需要开发自己的方法。

【问题讨论】:

  • 我的意思是您可以只输入 0xff 和您的号码...但我觉得您的工作流程可以更轻松。
  • 我不会撒谎,我对 0xff 的事情一无所知。但我会说我需要精确。我知道我可以使用一些算术将 32 位二进制转换回一个字节,我只是希望有一个库可以解决这个问题。我的意思是,当其他库不处理它时,为什么要使字节为 32 位,可以这么说.lol。而且我对位和字节算术不是很了解。
  • 例如, 1111 1111 1111 1111 1111 1111 1111 1111 等于 -1 ,我目前对java的字节'协议'还不够了解,所以我希望有一个快速的库方法.
  • 根据the Java specification,字节类型为8位长度,能够保存-128到127(含)的值。因此,您不能以 8 位字节类型存储 32 位值。您至少需要使用intlong 类型。
  • byteValue & 0xff 是正确的做法;它保留 int 的最低八位并将所有其他位设置为零,因为按位“与”与 0 清除位,按位“与”与 1 保留它,并且 ff₁₆ = 11111111₂。由于一个字节无论如何只有八个有意义的位,因此不会丢失任何精度。 InputStream 将字节作为 int 值返回,因为所有数字运算符都只对 int 和 long 进行操作,并且因为在 32 位架构中,对 8 位或 16 位数字的任何操作可能与对 32 位数字的操作具有相同的成本-位数。

标签: java string casting binary byte


【解决方案1】:

我找到了简单的答案:|

public class abc
{
    public static void main (String[] args)
    {
        byte b = -1;
        String binString = Integer.toBinaryString(b); //value 1111,1111,1111,1111,1111,1111,1111,1111
        new BigInteger(binString, 2).byteValue(); //value -1 
    }
}

它会截断 binString,但这不会影响字节值,因为左边的 24 位与字节并不真正相关。

现在,在上面的示例中,我使用 BigInteger 及其 byteValue() 方法,原因以及我不只是使用 0xff 解决方案的原因是代码中的 Integer.toBinaryString()上面将返回一个长度为 32 的字符串数字(32 个 1),这不能转换为 int 甚至是 long,因为它是一个太大的数字/值。因此,无法将其转换为 int 或 long,无法对其执行 & 之类的操作,因此解决方案是修剪左侧 24 位的字符串,然后可以将较短的字符串转换/转换为 int,这就是 BigInteger 在上面的代码中所做的。

字节仍将保持其值,因为该值仅包含在右侧的 8 位中(保持字节的真实性)。 java 有时会在 8 位字节中添加的 24 位,是出于 java 自己的目的,如果需要可以忽略,例如生成此线程的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 2018-12-11
    • 2021-12-20
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多