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

GSM 短信 PDU 模式編解碼實現:7位壓縮編碼與 UCS2 中文編碼

     編輯:關於C++

GSM 7-bit 默認字母表編碼 (英文/數字/符號)

GSM 03.38 規定短信默認使用 7 位編碼,將 8 位 ASCII 字符「壓縮」裝填,提高容量 (160 字符/條 vs 140 字節)。

編碼原理 (8-bit → 7-bit)

按位流連續讀取,每 7 位輸出一字節。示例 "1234" (ASCII: 0x31 0x32 0x33 0x34) → 0x31 0xD9 0x8C 0x06。


// 位流視圖
ASCII:  00110001 00110010 00110011 00110100
7-bit:  0011000 11101100 11000110 00000110  (分組)
Hex:    31       D9       8C       06

C++ Builder 實現


AnsiString EncodeEnglish(AnsiString InputStr) {
    AnsiString ret;
    int n = 0; // 當前位偏移 0-6
    for (int i = 1; i <= InputStr.Length(); i++) {
        unsigned char cur = InputStr[i];
        unsigned char next = (i < InputStr.Length()) ? InputStr[i+1] : 0;
        unsigned char val = (cur >> n) | ((next << (7-n)) & 0xFF);
        if (n == 6) { // 第7個字符特殊:只取高1位,下一字符將從頭開始
            val = cur >> 6;
            i++; // 跳過下一字符(已部分消費)
        }
        ret += IntToHex(val, 2);
        n = (n + 1) % 7;
    }
    return ret;
}

解碼邏輯 (7-bit → 8-bit)

逆向操作:根據位偏移從兩個連續 7-bit 字節中提取 8-bit ASCII。代碼使用查表 ReturnHex 獲取掩碼。

中文 UCS2 編碼 (16-bit Unicode)

中文不適用 7-bit 壓縮,直接使用 UCS2 (Big-Endian),即每個字符 2 字節,對應 GSM 03.38 中的「數據編碼方案」標識為 0x08 (UCS2)。

編碼:GB2312 → Unicode (CP936/UTF-16BE)


AnsiString EncodeChinese(AnsiString InputStr) {
    WideString ws = InputStr; // VCL 自動按系統代碼頁(CP936)轉寬字符
    AnsiString ret;
    for (int i = 1; i <= ws.Length(); i++) {
        ret += IntToHex((unsigned short)ws[i], 4); // 高位在前
    }
    return ret;
}

解碼:Unicode → 系統字符串


AnsiString DecodeChinese(AnsiString InputStr) {
    wchar_t buf[300];
    for (int i = 0; i < InputStr.Length(); i += 4) {
        buf[i/4] = StrToInt("0x" + InputStr.SubString(i+1, 4));
    }
    buf[InputStr.Length()/4] = 0;
    return WideCharToString(buf); // VCL 轉回 AnsiString
}

工程應用注意點

  • PDU 模式完整結構: 實際發送需構建完整 PDU 包含 SMSC 地址、PDU 類型、發送方號碼、協議標識 (PID)、數據編碼 (DCS)、有效期 (VP)、用戶數據長度 (UDL) 及用戶數據 (UD)。
  • 長短信拆分: 超過 140 字節 (7-bit 160 字符 / UCS2 70 字符) 需使用 UDH (User Data Header) 分段重組 (CSMS)。
  • 模塊差異: 不同廠商模塊 (SIMCom, Quectel, u-blox) AT 指令細節可能不同,需參考具體手冊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved