Java 中將 `String` 轉為 `byte[]`(位元組陣列)再轉為位元陣列(`boolean[]` 或 `BitSet`),核心 API 是 `String.getBytes(Charset)` 與位元遮罩操作。本文提供完整代碼、編碼選擇、效能對比。
String str = "我是好學生,My name is Studentdaiwei!";
// 1. 指定編碼(推薦 UTF-8)
byte[] bytes = str.getBytes(StandardCharsets.UTF_8); // Java 7+
// 或
byte[] bytes = str.getBytes("UTF-8"); // 可能拋 UnsupportedEncodingException
// 2. 預設編碼(平台相關,不推薦生產用)
byte[] bytesDefault = str.getBytes();
public static boolean[] bytesToBits(byte[] bytes) {
boolean[] bits = new boolean[bytes.length * 8];
for (int i = 0; i < bytes.length; i++) {
int b = bytes[i] & 0xFF; // 無符號轉換
for (int bit = 7; bit >= 0; bit--) {
bits[i * 8 + (7 - bit)] = (b & (1 << bit)) != 0;
}
}
return bits;
}
// 使用
boolean[] bits = bytesToBits(bytes);
System.out.println("總位元數: " + bits.length); // 例如 360 bits
// 印前 32 位
for (int i = 0; i < 32; i++) System.out.print(bits[i] ? '1' : '0');
import java.util.BitSet;
public static BitSet bytesToBitSet(byte[] bytes) {
BitSet bitSet = new BitSet(bytes.length * 8);
for (int i = 0; i < bytes.length; i++) {
int b = bytes[i] & 0xFF;
for (int bit = 0; bit < 8; bit++) {
if ((b & (1 << bit)) != 0) {
bitSet.set(i * 8 + bit);
}
}
}
return bitSet;
}
// 使用
BitSet bs = bytesToBitSet(bytes);
System.out.println("BitSet 長度: " + bs.length());
System.out.println("前 8 位: " + bs.get(0, 8)); // 取子集
// 還原位元組
byte[] restored = bs.toByteArray();
import java.nio.charset.StandardCharsets;
import java.util.BitSet;
import java.util.Arrays;
public class StringToBits {
public static void main(String[] args) {
String str = "我是好學生,My name is Studentdaiwei!";
System.out.println("原始字串: " + str);
// 1. String → byte[] (UTF-8)
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
System.out.println("位元組陣列長度: " + bytes.length);
System.out.println("Hex: " + bytesToHex(bytes));
// 2. byte[] → boolean[]
boolean[] bits = bytesToBits(bytes);
System.out.println("位元陣列長度: " + bits.length);
printBits(bits, 0, 48); // 印前 48 位 (6 bytes)
// 3. byte[] → BitSet
BitSet bitSet = bytesToBitSet(bytes);
System.out.println("BitSet cardinality (1 的個數): " + bitSet.cardinality());
}
static String bytesToHex(byte[] b) {
StringBuilder sb = new StringBuilder();
for (byte v : b) sb.append(String.format("%02X ", v & 0xFF));
return sb.toString();
}
static boolean[] bytesToBits(byte[] b) { /* 同上 */ return new boolean[0]; }
static BitSet bytesToBitSet(byte[] b) { /* 同上 */ return new BitSet(); }
static void printBits(boolean[] b, int from, int to) {
for (int i = from; i < to; i++) System.out.print(b[i] ? '1' : '0');
System.out.println();
}
}
| 編碼 | 中文支援 | 位元組/字元 | 適用場景 |
|---|---|---|---|
| UTF-8 | 完美 | 1-4 bytes | **標準推薦**、Web、儲存、傳輸 |
| GBK/GB2312 | 完美 | 2 bytes | 舊系統相容、中文 Windows 控制台 |
| ISO-8859-1 | 不支援 | 1 byte | 純西文、HTTP Header |
| UTF-16BE/LE | 完美 | 2/4 bytes | 特定協定、檔案格式 |
核心口訣:**`str.getBytes(StandardCharsets.UTF_8)` → `byte[]` → 位元遮罩 `(b >> i) & 1` 或 `BitSet` → 位元陣列**。指定 UTF-8 編碼、無符號轉換、選擇 `BitSet` 儲存大量位元。