如何用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
相关产品推荐
相关产品推荐

