首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

MIME 編碼詳解:Quoted-Printable 與 Base64 C 實現完全指南

     編輯:關於C++

背景釐清

MIME (Multipurpose Internet Mail Extensions) 定義了多種編碼傳輸機制,本文實現其中兩種核心編碼:

  • Quoted-Printable (QP): 適用於文本數據,非打印字符用 =XX (十六進制) 表示,行長限制 76 字符(本實現簡化未換行)。
  • Base64: 適用於二進制數據,每 3 字節編碼為 4 個可打印字符 (A-Z, a-z, 0-9, +, /),不足補 =。

核心編解碼表


// QP: 4位 -> 0-9, A-F
// Base64: 6位 -> A-Z(0-25), a-z(26-51), 0-9(52-61), +(62), /(63)

API 設計 (標準 C 風格,便於跨語言調用)


int QPEncode(char *dest, const unsigned char *src, int srcLen);     // dest 需 ≥ srcLen*3
int QPDecode(unsigned char *dest, const char *src);                 // dest 需 ≥ strlen(src)/3
int Base64Encode(char *dest, const unsigned char *src, int srcLen); // dest 需 ≥ srcLen*4/3+4
int Base64Decode(unsigned char *dest, const char *src);             // dest 需 ≥ strlen(src)*3/4
// 返回值:編碼後數據長度 (不含結束符 \0)

關鍵算法細節

Base64 編碼 (3字節 → 4字符)

按 6 位分組:[b1>>2] [b1<<4|b2>>4] [b2<<2|b3>>6] [b3&0x3F]。循環處理,餘數補 =。

Base64 解碼 (4字符 → 3字節)

跳過無效字符(換行符等),遇 = 停止。按 6 位還原:[c1<<2|c2>>4] [c2<<4|c3>>2] [c3<<6|c4]。

QP 編碼/解碼

逐字節轉 =HH 格式。解碼時識別 = 後兩字符為十六進制,其餘直通。

BCB/Delphi 封裝示例

文章提供 AnsiString / TMemoryStream 封裝函數 MimeQPBase64,並給出 Delphi 導入 .obj 的完整單元代碼 (external 聲明)。

修正歷史與健壯性

  • 初版僅處理連續字符串,後修正支持含換行符的郵件附件解碼(跳過無效字符)。
  • 緩衝區大小建議:編碼輸出預留 33%-200% 空間,解碼輸出預留 75% 空間。
  • 線程安全:純無狀態函數,可直接多線程調用。

現代化建議

  • 使用 std::string_view/span 避免緩衝區溢出風險。
  • 返回 std::optional 或拋出異常處理錯誤輸入。
  • 集成 SIMD 指令集 (SSSE3/AVX2) 加速 Base64 大數據處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved