电信CDMA PDU短信号码字段编码转换的python实现

news2024/11/17 16:17:10

参考链接:CDMA(3GPP2)SMSPDU全解析-爱码网

CDMA SMS pdu解码_zx249388847的博客-CSDN博客_cdma sms
cdma pdu解析终极文档_月之海的博客-CSDN博客
CDMA PDU 编解码补充解析_zx249388847的博客-CSDN博客

CDMA – lytsing's Blog

一、PDU串解析

        CDMA的pdu格式与GSM的相差很多,不能直接用肉眼看出来。第一条内容比较长,就拿第二条pdu串来分析吧。

1.首先将PDU串打成PDU包将PDU串相邻的两个ascii字符拼凑成一个8bit数据

如下:
00 00 02 10 02 02 07 02 c5 4c e2 25 a8 a8 06 01 4c 08 4d 00 03 10 01 f8 01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8 03 06 08 12 29 19 26 16

消息传送类型: 0x00     point to point message(表示点对点消息)

下面的内容为短消息的各个字段 每个字段分为三个部分: 字段类型(ID)(8bit)、字段长度(Length)(8bit)和字段内容.

第一个字段: 00 02 10 02
        0x00, 表示uTeleserviceID字段
        0x02, 字段长度,该长度必须为2,否则为错误的pdu信息

        字段内容为:0x1002,十进制是4098,

第二个字段: 02 07 02 c5 4c e2 25 a8 a8
        0x02, SMS_TL_ORIG_ADDR 表示 (短信发送地址)
        0x07, 字段长度为7


字段内容: 02 c5 4c e2 25 a8 a8
只看前面几个 02 c5 4c e2的:
        0000 0010 1100 0101 0100 1100 1110 0010 0010
取第一个bit 0 表示 RIL_CDMA_SMS_DIGIT_MODE_4_BIT 是4bit压缩
第二个bit 0 表示 RIL_CDMA_SMS_NUMBER_MODE_NOT_DATA_NETWORK
下来8个bit 是 00 0010 11 = 11,表示号码长度 为11
由于是4bit压缩 ,后面44个bit(4*11)表示号码,解析出来是15338896020

第三个字段: 06 01 4c
        表示SMS_TL_BEARER_RPLY_OPT

第四个字段:08 4d 00 03 10 01 f8 01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8 03 06 08 12 29 19 26 16

0x08, 表示SMS_TL_BEARER_DATA字段(短信内容)
0x4d,字段长度为77

这个字段也分成各个子字段:

第一子字段: 00 03 10 01 f8
0x00 Mesage Id
0x03 内容长度
10 01 f8  === 0001 0000 0000 0001 1111 1000
0001 表示 DELIVER 短信
0000 0000 0001 1111表示 message id.
紧接后面的 1, 表示HEADER_IND

第二个子字段:01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8
0x01, 字段类型
0x3e(62),字段长度
20 f0 01 === 0010 0000 1111 0000 0000 0001
0x20 的前5个bit为00100, 为0x04, 表示短信编码方式为RIL_CDMA_SMS_ENCODING_UNICODE (UNICODE)
0x20 的后3个bit, 0xf0的前5个bit,为 000 1111 0, 即0x1e (30),表示有30个UNICODE 字符。0xf0的后3个bit,0x01的8个bit,再加上0x90的前5个bit,

0000 0000 0011 0010 拼成一个16位数是 0x0032 表示字符 :2,在vim下了解一个字符的16进制码很简单,光标在该字符,按ga,底端显示结果如下:

<2>  50,  Hex 32,  Octal 062                                  2,1           All

依次下去,内容就是上面运行./test_pdu_decode 的结果: 2/2,对一阵阵的狂风,勇敢地作战.只要我的爱人,是一只小鸟

第三个子字段: 03 06 08 12 29 19 26 16

这是一个时间戳字段: 08年12月29号19时26分16秒(短消息发送时间)

二、地址参数字段

040702C4CC48489858       ========== 》Address Parameters(地址参数字段):

此字段为可变长度

参数ID号1个字节:04表示目的地址(接收方号码) 02表示发起方地址(发送方号码)

参数长度1个字节:07表示后面的数据占7个字节

号码编码模式1bit:0表示使用4bit的未知编码方案的DTMF编码 1表示使用8bit的指定编码方案的8bit编码

号码地址模式1bit:0表示使用ANSI TI.607定义的地址  1表示使用数据网络地址格式

号码类型0或者3个bit:如果号码编码模式为0,此字段忽略

号码编码方案0或者4个bit:如果号码编码模式为0或者号码地址模式为1,此字段忽略

号码个数8bit:指示号码字符个数

号码数字或者字符的编码:4bit或者8bit编码

填充字段0到7bit:保证地址参数字段为整数个字节,填充为0

将02C4CC48489858转化为2进制数据:

0000 0010 1100 0100 1100 1100 0100 1000 0100 1000 1001 1000 0101 1000

再按字段组合:

0 0 00001011 0001 0011 0011 0001 0010 0001 0010 0010 0110 0001 0110 00

从上面的字段组合可以看出:

号码编码模式取0表示使用4bit编码

号码地址模式取0表示使用ANSI TI.607定义的地址

由于号码编码模式取0没有号码类型和号码编码方案

号码个数为11个,号码为13312122616,填充字段为00

三、python转换实现地址参数字段

 进制转换地址参考:二进制转换器 - 在线进制转换 - 木鱼查询

首先需要将手机号码由十六进制转换成二进制:

b = bin(int(number_change, 16))
print('十六进制转二进制后:{}'.format(b[2:]))

但有个问题,那就是关于号码中的0字段,需要转换成A,即

number_change = number.replace('0', 'A')
print(f'号码转换前:{number},转换后:{number_change}')

当前编码的是发送的短信,可以参考前面的内容,拼接语句:

bin_sum = '100000001110000001011000' + b[2:] + '00'
print(f'转二进制后完整字段内容:{bin_sum}')

之后进行十六进制转换:

hex_s = hex(int(bin_sum, 2))[2:]
print(f'转十六进制后内容输出:{hex_s}')

当前040702C4CC48489858仅进行40702C4CC48489858转换,前面的0可后面直接添加

def numbertopdu(number):
    number_change = number.replace('0', 'A')
    print(f'号码转换前:{number},转换后:{number_change}')
    b = bin(int(number_change, 16))
    print('十六进制转二进制后:{}'.format(b[2:]))
    bin_sum = '100000001110000001011000' + b[2:] + '00'
    print(f'转二进制后完整字段内容:{bin_sum}')
    hex_s = hex(int(bin_sum, 2))[2:]
    print(f'转十六进制后内容输出:{hex_s}')
    return hex_s

phonenumber = '13312122616'
numbertopdu(phonenumber)

运行结果如下:

 

 比较

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaMail 网易邮件发送demo-发送带附件的邮件

本文为joshua317原创文章,转载请注明&#xff1a;转载自joshua317博客 JavaMail 网易邮件发送demo-发送带附件的邮件 - joshua317的博客 使用Java应用程序发送 E-mail&#xff0c;需要在机子上安装 JavaMail API 和Java Activation Framework (JAF) 。 可以从 Java 网站下载最…

装饰器(Decorator)模式Recap

设计模式是一套积累并融合了大量经验与成熟思考的设计心法&#xff0c;每一个程序员在成长道路上都应该始终保持对最佳设计方案的不断追求。设计模式也会常用常新&#xff0c;值得反复研究和应用。本文简单Recap一下装饰器&#xff08;Decorator&#xff09;模式。 说句体外话…

【Paper】2020_离散多智能体系统的事件触发二分一致性研究_刘雨欣

文章目录第 4 章 有向符号图下离散多智能体系统的事件触发二分一致性4.3.1 示例一4.3.2 示例二系统 动态方程、控制输入及事件触发条件分别如式(2.1)、(3.1)及式(3.6)所示。 本文考虑一阶离散多智能体系统&#xff0c;第 iii 个智能体的动态方程如下: xi(k1)xi(k)ui(k)(2.1)\b…

千字长文!C++每日一练——Day3

&#x1f411;本文作者&#xff1a;C橙羊&#x1f411; &#x1f3ae;&#x1f50a;本文代码适合编译环境&#xff1a;DEV-C&#x1f4bb; ✨&#x1f9e8;温馨提示&#xff1a;此文乃作者心血&#xff0c;如要转载请标注版权&#xff0c;否则视为抄袭&#xff01;&#x1f389…

多线程——线程同步器CountDownLatch

多线程——线程同步器CountDownLatch&#xff08;一&#xff09;CountDownLatch案例入门【1】CountDownLatch和join的区别【2】CountDownLatch案例一&#xff1a;等待线程等待工作线程【3】CountDownLatch案例二&#xff1a;主线程main等待子线程【4】CountDownLatch案例三&…

.NET Conf China 2022 精彩回顾 | IOT专场

12月充满惊喜 各种美好的节日纷至沓来 奖励一年辛苦劳作的我们 本月程序员第一场节日 就是精彩的 .NET Conf China 2022 .NET Conf China 2022是面向开发人员的社区峰会&#xff0c;延续 .NET Conf 2022的活动&#xff0c;庆祝 .NET7的发布和回顾过去一年来 .NET在中国的发…

举个栗子~Alteryx 技巧(4):教你设置 Alteryx Server 用户权限

分析用户在用 Alteryx Designer 创建好工作流之后&#xff0c;如何在企业内部实现共享和管理分析工作流程、模型及数据呢&#xff1f;方法很简单&#xff1a;发布到 Alteryx Server &#xff01; Alteryx Server 通过内置的数据治理、集中管理的安全性和高可用性&#xff0c;可…

svn:E720005 move .svn/tmp拒绝访问

cleanup也clean不了 此时要用sqlite3.exe来解决了到有.svn的目录地下&#xff0c;把sqllite3.exe拷贝到这个下面 在目录里面打开cmd窗口&#xff0c;执行 sqlite3 .svn/wc.db "select * from work_queue" 如果查出内容&#xff0c;那么执行 sqlite3 .svn/wc.db …

【Dubbo3高级特性】「性能优化技术」Dubbo3完成扩展使用高效的Kryo和FST序列化开发实战

系列文章目录 如果你看到了这里&#xff0c;那么接下来你将会认识Dubbo3的诞生将如何引领微服务领域更进一步&#xff0c;从而迈入云原生的领域&#xff0c;这当然不仅仅是Dubbo3&#xff0c;之前也介绍了Java生态另外一个云原生领域的技术Quarkus等技术&#xff0c;而本文内容…

Spring Boot 实现微信点餐系统

架构 前后端分离&#xff1a; 部署架构&#xff1a; 补充&#xff1a; setting.xml 文件的作用&#xff1a;settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。 maven的作用…

校招求职经验分享——我是如何本科进入大厂的

写在开头 最近签完了三方&#xff0c;大学前三年的生涯规划和努力最终还是得到了兑现&#xff0c;脑子里不断涌现这几年来的经历&#xff0c;一直想着写点什么东西记录一下&#xff0c;刚好大四空闲时间真的太多&#xff0c;心血来潮&#xff0c;不如还是写写吧&#xff0c;记录…

mysql cdc 整库迁移 (mysql to mysql)

技术思想 利用 mysql catalog&#xff0c;mysql cdc&#xff0c;flink jdbc 等技术实现 mysql 整库迁移至下游数据库&#xff0c;这里是示范 mysql to mysql &#xff0c;其他 sink 组件可自行扩展实现。 通过 flink ParameterTool&#xff0c;可以选择是整库同步还是多表亦或…

2023年天津天狮学院专升本报名考试的安排

天津天狮学院2023年高职升本科考试报名时间安排的通知 一、报名条件 报名条件和具体要求按照天津市招生委员会的文件规定执行。考生必须完成文化课报名环节&#xff0c;且填报天津天狮学院志愿&#xff0c;且具备我校提出的线上考试条件&#xff0c;方可报考我校专业课考试。考…

Java作业

这里写自定义目录标题java16次作业新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是…

python-网络编程

python-网络编程 网络编程的理论概述&#xff1a; 现在的生活离不开网络&#xff0c;例如手机&#xff0c;电脑&#xff0c;平板&#xff0c;都是网络的代名词&#xff0c;通过一些APP&#xff0c;浏览器&#xff0c;获取大量的信息如 文字、声音、视频&#xff0c;这都是从网…

[Linux]------线程同步和信号量

文章目录前言一、条件变量同步概念与竞态条件条件变量函数初始化销毁等待条件满足唤醒等待为什么pthread_cond_wait需要互斥量&#xff1f;条件变量使用规范二、生产者消费者模型为何要使用生产者消费者模型生产者消费者模型的优点基于BlockingQueue的生产者消费者模型C queue模…

1.MyBatis简介

1.概念 MyBatis是一款开源的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。 与其它ORM框架不同&#xff0c;MyBatis没有将Java对象与数据表关联起来&#xff0c;而是作为Java方法和SQL语句的桥梁&#xff0c;一般称它为“半自动化ORM”框架。 2.Mybatis架构 …

【软件测试】在我刚上岗时,资深测试给我的建议让我受益匪浅......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 建立测试基线 当我还…

BNB Chain对Zebec生态大力扶持,ZBC或继续登录一线平台

在行业早期开始&#xff0c;流支付赛道就已经具备了早期的轮廓&#xff0c;而在流支付协议Zebec Protocol出现后&#xff0c;该领域被推向了一个新的发展高度&#xff0c;并得到加密领域以及传统商业领域的高度关注。而随着生态的商业进展不断推进、生态不断壮大&#xff0c;Ze…

C++代码优化(1):条款1~4

"不要烟火不要星光&#xff0c;只要问问你内心的想法。" 本栏仅仅 由对《Effictive C》其中的一系列条款&#xff0c;掺杂着自己一些愚钝的理解而写的。 ---前言 条款01: 尽量以const、enum、inline 替换 #define 在谈及上述好几个关键字 与define宏定义的关系&…