将二进制字符串转换为字节数组

14

我有一个由一串0和1组成的字符串,我想将其转换为一个字节数组。

例如,String b = "0110100001101001"。如何将其转换为长度为2的byte[]数组?


3
@kocko他有16位元... - Vincent van der Weele
根据字符串 b,您需要一个长度为2的 byte[],其中位置0中为 104,位置1中为 105 - Clark Kent
可能是将字符串转换为字节数组的重复问题。 - Shashi
3个回答

26

把它转换为二进制的整数,然后转换为字节数组。实际上,既然你有16位,是时候使用不常用的short了。

short a = Short.parseShort(b, 2);
ByteBuffer bytes = ByteBuffer.allocate(2).putShort(a);

byte[] array = bytes.array();

6
如果字符串包含的位数太多,甚至一个long变量也无法容纳,该怎么办? - Luiggi Mendoza
如果字符串太大,那么你会得到一个“NumberFormatException”。我做出了假设,对于这个小例子来说它少于32个字符。 - Jeff Foster
那么这并不是一个万无一失的解决方案。是否有简单代码或需要手动处理字符串内容的解决方案? - Luiggi Mendoza
3
我不确定这可以变得更简单吗?如果b的格式无效,将抛出NumberFormatException异常,并由调用方处理错误。欢迎提出改进意见,但我认为这已足以阐明重点。 - Jeff Foster
@LuiggiMendoza 使用另一个答案建议的 BigInteger 将解决这个问题。 - Steve P.
谢谢,这个方法很有效。不过我应该更清楚地说明,我将字符串每8个字符一组进行了拆分,因此我只需要循环遍历拆分后的字符串并将其添加到byte[]数组中。 - Ryan Jackman

25

另一个简单的方法是:

String b = "0110100001101001";
byte[] bval = new BigInteger(b, 2).toByteArray();

4
它无法解析“1110100001101001”。 - Evgeniy Dorofeev
2
您可能会遇到一些符号问题。请参考 https://dev59.com/YIDba4cB1Zd3GeqPFYhp。 - will
当我显示byte[] fspec = new BigInteger("10000000", 2).toByteArray();时,它显示的是[B@3b22cdd0而不是预期的值 - 为什么? - Line
2
@Line 因为你的显示方式不正确。请参阅最简单的打印Java数组的方法是什么? - Andreas

2
假设您的二进制字符串可以被8整除而不产生余数,则可以使用以下方法:
/**
 * Get an byte array by binary string
 * @param binaryString the string representing a byte
 * @return an byte array
 */
public static byte[] getByteByString(String binaryString){
    Iterable iterable = Splitter.fixedLength(8).split(binaryString);
    byte[] ret = new byte[Iterables.size(iterable) ];
    Iterator iterator = iterable.iterator();
    int i = 0;
    while (iterator.hasNext()) {
        Integer byteAsInt = Integer.parseInt(iterator.next().toString(), 2);
        ret[i] = byteAsInt.byteValue();
        i++;
    }
    return ret;
}

请不要忘记将guava库添加到您的依赖项中。

在Android应用的gradle文件中,应添加以下内容:

compile group: 'com.google.guava', name: 'guava', version: '19.0'

并将以下内容添加到项目gradle文件中:

allprojects {
    repositories {
        mavenCentral()
    }
}

更新1

这篇文章提供了一个不使用Guava Lib的解决方案。


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