首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 字串轉位元組陣列與位元陣列:getBytes() 與位元操作完整指南

     編輯:程式設計疑難解答

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();

位元組陣列 → 位元陣列 (boolean[])

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');

位元組陣列 → BitSet (更節省記憶體、功能豐富)

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特定協定、檔案格式

效能提示

  • 大量轉換時重用 `CharsetEncoder` / `ByteBuffer` 避免物件分配
  • `BitSet` 比 `boolean[]` 記憶體節省 8 倍(1 bit vs 1 byte/boolean)
  • 位元操作用 `& 0xFF` 將 `byte` (有號) 轉無號 `int`,避免負數擴展

核心口訣:**`str.getBytes(StandardCharsets.UTF_8)` → `byte[]` → 位元遮罩 `(b >> i) & 1` 或 `BitSet` → 位元陣列**。指定 UTF-8 編碼、無符號轉換、選擇 `BitSet` 儲存大量位元。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved