SIM808模块字母数字Sender ID编码串解码方法咨询
解码SIM808收到的字母数字发送者ID编码
嘿,我来帮你搞定这个解码问题!你看到的14w4w2#45444147425其实是SIM808模块把字母数字发送者ID的GSM协议编码直接以ASCII字符形式返回的结果,咱们一步步来拆解它:
为什么会出现这种奇怪的编码?
当短信发送方使用字母数字ID(比如商家品牌名)时,GSM协议会用GSM 7-bit默认字符集把这个ID编码成字节流,而SIM808模块没有自动帮你解码成明文,直接把这些字节对应的ASCII字符输出了,所以就出现了这种看起来杂乱的字符串。
具体解码步骤
1. 把编码字符串转成字节数组
先把每个字符转换成对应的ASCII字节值,比如'1'对应0x31,'w'对应0x77,'#'对应0x23,以此类推。
2. 解码GSM 7-bit字符集
GSM 7-bit是用7位二进制表示一个字符,多个字符的编码会被打包成8位字节(简单说就是8个字符占7个字节)。解码时要:
- 把所有字节的二进制位串连起来
- 按每7位一段分割,每一段就是一个字符的编码值
- 对照GSM 7-bit字符表,把编码值转成原始字符
3. 处理协议自带的长度指示
字母数字发送者ID的协议字段开头通常会有一个“长度字节”,用来表示ID的字符数,解码后如果开头有多余的字符,手动去掉就行。
用Python脚本自动解码
手动计算太麻烦,给你写个简单的Python脚本,直接运行就能得到结果:
# GSM 7-bit标准字符映射表,索引对应编码值 GSM_7BIT_TABLE = ( "@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞ\x1bÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?" "¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑÜ`¿abcdefghijklmnopqrstuvwxyzäöñüà" ) def decode_gsm_sender_id(encoded_str): # 把编码字符串转成ASCII字节数组 data_bytes = encoded_str.encode('ascii') # 把所有字节转成二进制位串 all_bits = ''.join(f"{byte:08b}" for byte in data_bytes) # 按7位分割解码 decoded_chars = [] for i in range(0, len(all_bits), 7): if i + 7 > len(all_bits): break # 把7位二进制转成十进制编码,再查映射表 code = int(all_bits[i:i+7], 2) decoded_chars.append(GSM_7BIT_TABLE[code]) return ''.join(decoded_chars) # 替换成你收到的编码字符串 your_encoded_sender = "14w4w2#45444147425" original_id = decode_gsm_sender_id(your_encoded_sender) print(f"原始发送者ID: {original_id}")
如果解码后开头有奇怪的字符(比如数字或符号),大概率是协议里的长度指示,直接删掉前1-2个字符就好。
小提示
要是解码结果不对,可能是模块返回的编码做了半字节反转(就是每个字节的高低4位换了位置),这时候可以在脚本里加一步反转每个字节的高低4位再解码,比如把byte换成((byte & 0x0F) << 4) | ((byte & 0xF0) >> 4)。
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

