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

Java 二進位資料與字串轉換:正確處理 GBK 編碼檔案傳輸與還原

     編輯:程式設計綜合問答

問題場景

需求:以 GBK 編碼讀取檔案二進位流 → 封裝進 XML → 網路傳輸 → 接收端按 GBK 寫回檔案。開發者嘗試將位元組轉字串再處理,導致資料損壞無法還原。

核心誤區

  • 將任意二進位資料強行按 GBK 解碼為字串,再序列化進 XML。GBK 是字元編碼,僅能正確處理合法文字資料;圖片、壓縮檔、加密資料等任意位元組序列解碼會產生替換字元()或丟失位元組,導致不可逆。
  • XML 本身是文字格式,直接嵌入二進位會破壞結構(含控制字元、未配對代理項等)。

正確方案:Base64 編碼

  1. 發送端:讀取檔案位元組陣列 → Base64.getEncoder().encodeToString(bytes) → 存入 XML 文字節點。
  2. 傳輸:XML 純文字,安全通過任何文字協定(HTTP、WebSocket、Message Queue)。
  3. 接收端:從 XML 取出 Base64 字串 → Base64.getDecoder().decode(str) → 還原位元組陣列 → 直接寫入檔案(完全二進位寫入,無需指定編碼)。

代碼範例

// 發送端
byte[] data = Files.readAllBytes(Paths.get("source.dat"));
String base64 = Base64.getEncoder().encodeToString(data);
// 將 base64 寫入 XML ...

// 接收端
byte[] restored = Base64.getDecoder().decode(base64FromXml);
Files.write(Paths.get("target.dat"), restored); // 完全還原,位元組級相同

為何不需要「按 GBK 寫回」

檔案本身是位元組序列,沒有「編碼」屬性。Base64 還原後的位元組與原檔逐位元組相同,直接寫入即可。只有當原檔為純文字檔且需轉碼(如 GBK → UTF-8)時,才需解碼/編碼處理。

總結

  • 二進位資料傳輸請永遠使用 Base64(或十六進位)編碼,切勿嘗試按文字編碼轉字串。
  • 接收端直接寫入位元組陣列,無需指定編碼,保證位元組級完美還原。
  • 若原檔確為 GBK 文字檔且需轉碼,請在還原位元組後用 new String(bytes, "GBK") 解碼,再按目標編碼寫入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved