[python] 7bit短信PDU报文解码

 photo 1c87f8b6-60de-43ec-b42a-51affff1318a_zps30299d53.png

又是好久没有更新博客,这么长的时间里,装修了新房,也讨了个老婆哈。积攒了不少题目,不过感觉还是缺少规划把它们分享出来,也有不少烂尾的事情,有时间好好续上。

这段时间的工作和短信猫打交道比较多,这东西深入研究也蛮有意思。

测试发现,当发送一条纯ascii码的短信时,单条短信可以允许160个字符,而不是之前以为的140个。经@标准三戒提示,说是内部使用的是7bit的编码。所有140个字节,可以表示 140*8/7=160 个ascii码。

一段正文的pdu就是这个样子:

s = '39DCCD56A3CD6431580E77B3D56833590C96C3DD6C35DA4C1683E570375B8D3693C56039DCCD56A3CD6431580E77B3D56833590C96C3DD6C35DA4C1683E570375B8D3693C56039DCCD56A3CD6431580E77B3D56833590C96C3DD6C35DA4C1683E570375B8D3693C56039DCCD56A3CD6431580E77B3D56833590C96C3DD6C35DA4C1683E570375B8D3693C560'

len(s) = 280,因为每2个字符表示一个8位的byte。7bit的转换:

import re
def convert(s):
  s = ''.join((re.findall(r'..', s)[::-1]))    
  r = ''
    
  d = int(s, 16)
  while d:
    r += chr(d & 0x7f)
    d >>= 7

  return r

结果就是

‘9876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210’

感受就是虽然python这种看起来是离具体字节操作比较远的语言,进行位操作也很方便,而又正因为它对类型要求不那么具体,int(s, 16)这样的操作可以直接干出来,虽然结果是一个很长的长整形,精度也没有任何损失。每两位取出字符,并且调换顺序,用re也能轻松搞定,写起来还是很爽。

接下来会写更多关于短信猫的博客吧,开始动起来,就好。

愿python代码越像python~

关于aGuegu

阿古 真名:官微宏,技术Geek,玩Arduino,玩Linux,爱Google,爱开源;现居福州
此条目发表在python分类目录,贴了, , , , 标签。将固定链接加入收藏夹。
  • 乡间河太急

    阿古,好久没来你这儿逛逛咯,都怪你一直没更新。
    结婚了?恭喜恭喜啊!