Java 二进制字符串转 byte 数组
在 Java 中,将二进制字符串(如 "10110011")转换为 byte 数组有几种方法,以下是几种常见的实现方式:

逐位转换
public static byte[] binaryStringToByteArray(String binaryString) {
// 确保字符串长度是8的倍数
if (binaryString.length() % 8 != 0) {
throw new IllegalArgumentException("二进制字符串长度必须是8的倍数");
}
byte[] byteArray = new byte[binaryString.length() / 8];
for (int i = 0; i < binaryString.length(); i += 8) {
String byteStr = binaryString.substring(i, i + 8);
byte b = (byte) Integer.parseInt(byteStr, 2);
byteArray[i / 8] = b;
}
return byteArray;
}
使用位操作
public static byte[] binaryStringToByteArray(String binaryString) {
if (binaryString.length() % 8 != 0) {
throw new IllegalArgumentException("二进制字符串长度必须是8的倍数");
}
byte[] byteArray = new byte[binaryString.length() / 8];
for (int i = 0; i < binaryString.length(); i += 8) {
byte b = 0;
for (int j = 0; j < 8; j++) {
if (binaryString.charAt(i + j) == '1') {
b |= (1 << (7 - j)); // 最高位在前
}
}
byteArray[i / 8] = b;
}
return byteArray;
}
使用 BigInteger(适用于超大二进制字符串)
import java.math.BigInteger;
public static byte[] binaryStringToByteArray(String binaryString) {
// 去除可能的空格
binaryString = binaryString.replaceAll("\\s", "");
// 如果长度不是8的倍数,在前面补零
if (binaryString.length() % 8 != 0) {
int padding = 8 - (binaryString.length() % 8);
binaryString = "0".repeat(padding) + binaryString;
}
// 转换为BigInteger,然后转换为byte数组
BigInteger bigInt = new BigInteger(binaryString, 2);
byte[] byteArray = bigInt.toByteArray();
// 处理符号位问题
if (byteArray.length * 8 > binaryString.length()) {
// 如果转换后的数组比预期长,说明有符号位扩展,需要截断
byte[] result = new byte[binaryString.length() / 8];
System.arraycopy(byteArray, byteArray.length - result.length, result, 0, result.length);
return result;
}
return byteArray;
}
使用示例
public static void main(String[] args) {
String binaryStr = "10110011 01010101 11110000";
byte[] byteArray = binaryStringToByteArray(binaryStr);
for (byte b : byteArray) {
System.out.print(String.format("%8s ", Integer.toBinaryString(b & 0xFF)));
}
}
注意事项
- 二进制字符串长度必须是8的倍数,否则需要先进行填充或截断
- Java的byte是有符号的(-128到127),转换时要注意符号位
- 如果二进制字符串表示的是无符号整数,可能需要额外的处理
- 对于大文件或频繁转换,考虑性能优化
选择哪种方法取决于你的具体需求,特别是二进制字符串的大小和性能要求。

