You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言实现GSM 7位编码解码?特定字符串异常排查

GSM 7位编码处理"1231#"时末尾出现00的问题解决方法

问题根源分析

"1231#"共7个字符,每个字符对应GSM 7位编码,总位数为7*7=49位。按照GSM 7位打包规则,需补7个0凑成56位(7字节),最后一个字节应为0x80而非0x00。出现0x00的核心原因是填充位处理错误或字节数计算/位拼接逻辑错误。

常见错误点及修复方案

1. 输出字节数计算错误

错误写法(整数除法导致少算字节):

int output_len = input_len *7 /8; // 7*7/8=6,实际需要7字节

修复为向上取整:

int output_len = (input_len *7 +7)/8; // 等价于ceil(49/8)=7

2. 位拼接时的字节内位顺序错误

GSM 7位编码要求将字符的7位(bit6到bit0)依次写入bit流,每个字节的高位对应bit流的先写入位。若代码中错误地将bit流的位写入字节的低位,会导致最后一个有效位被放错位置,甚至出现全0字节。

错误的位位置计算:

int bit_in_byte = bit_pos %8; // 把bit流的第n位写入字节的第n%8位(低位开始)

修复为:

int bit_in_byte =7 - (bit_pos %8); // 把bit流的第n位写入字节的第7-(n%8)位(高位开始)

3. 最后字符的位未完全写入

若代码在处理最后一个字符时,因循环条件错误提前退出,导致7位未全部写入bit流,剩余位被默认填充为0,最终出现全0字节。需确保每个字符的7位都被完整处理:

// 正确的字符位循环:遍历code的bit6到bit0
for(int j=6; j>=0; j--){
    // 写入bit流逻辑
    bit_pos++;
}

验证修复后的编码结果

修复后,"1231#"的GSM 7位编码字节序列应为:
0x54, 0xC5, 0x93, 0x35, 0x4C, 0x51, 0x80
解码时,需按同样的位顺序反向解析,即可还原原字符串,不会出现@符号(@的GSM 7位编码是0x00,对应全0字节)。

内容的提问来源于stack exchange,提问作者Om Mahawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:30:16