short message 2

本文介绍了短信收发的PDU模式及其应用场景。PDU模式支持7-bit、8-bit及UCS2编码,适用于不同类型的短信内容。文章还详细解析了移动和电信运营商的短信收发PDU格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

pdu

 

收发短消息有三种模式:BLOCK 模式、TEXT 模式和 PDU 模式。

BLOCK 模式现在用的很少了; TEXT 模式则只能发送 ASCII 码,它不能发送中文的

UNICODE 码——确切地讲,从技术上来说是可以用于发送中文短消息的,但是国内的手机

基本上不支持;而 PDU 模式开发起来则较为复杂,它需要编写专门的函数来将文本转换为

PDU 格式,但 PDU 模式被所有手机支持,可以使用任何字符集,它也是手机默认的编码方

式。

 

PDU 模式

用 PDU 模式收发短消息可以使用三种编码: 7-bit 编码、8-bit 编码和 UCS2 编码。7-bit

编码用于发送普通的 ASCII 字符;8-bit 编码通常用于发送数据消息,如图片或铃声等;UCS2编码用于发送 Unicode 字符。

 

PDU 串除了包含所发送的消息本身外,还包含很多其它参数信息,如服务中心号码、目标号码和编码方式等

pdu === smsc + tpdu + BearerData 

 

移动 

发短信

08 91 683108100005F0 31 00 0D 91 683119109991F2 00 08 C2              06 60A8597DFF01

接短信

08 91 683108100005F0 04    0D 91 683119109991F2 00 08 40 406031353023 06 60A8597DFF01

 

 

电信

接短信

00000000 00001002 00000000 00 00 00 00 0b 3138393031333339383933  00000000 00 00 00 00000016 00 03 100c60 | 01 04 200cb1f8 | 03 06 110330111954 | 09 01 00

code cdma/SmsMessage.java

 

messageType  teleService serviceCategory digitMode numberMode ton numberPlan length  18901339893           bearerReply replySeqNo                                      阿

00000000      00001002   00000000         00       00         00  00          0b    3138393031333339383933  00000000    00        00 00 00000016 00 03 100c60 | 01 04 200cb1f8 | 03 06 110330111954 | 09 01 00

 

 

发短信

00000000 00001002 00000000 00 00 00 00 0b 3138393031333339383933  00000000 00 00 00 00000016 00 03 100c60 | 01 04 200cb1f8 | 03 06 110330111954 | 09 01 00

 

电信通过UTK,读UIM卡报回来的PDU还有另外一种格式

00 00 02 1002 | 04 04 0146AA84 | 08 0C 000320000001050019898188

 

00     | 00            02        1002 | 04         04        0146AA84 | 08         0C      00        03        200000 01         05        0019898188

SMS P2P| TeleserviceID TI_length id   | DstAddress DA_length address  | BearerData length  Mesage_Id id_length id     User_data  data_len 

 

所以要自己写代码编解码这种格式的PDU

 

### C#中将 `int` 类型转换为 `short` 类型的方法 在C#中,由于 `int` 是一种更大的数据类型(占用4字节),而 `short` 则是一种较小的数据类型(占用2字节)。因此,在将 `int` 转换为 `short` 时可能会发生溢出的情况。为了安全地完成这种转换,通常需要显式的强制类型转换。 以下是几种常见的实现方式: #### 方法一:使用 `(short)` 进行强制类型转换 这是最常见的方式之一,通过直接指定目标类型来执行转换操作。 ```csharp int intValue = 32767; // int的最大值可以超过short范围 short shortValue = (short)intValue; Console.WriteLine(shortValue); ``` 需要注意的是,如果 `intValue` 的值超出了 `short` 数据类型的取值范围(即 `-32768 ~ 32767`),则会发生截断现象或者引发异常[^1]。 --- #### 方法二:利用 `checked` 关键字检测溢出情况 当启用编译器的溢出检查功能时,可以通过 `checked` 来捕获可能发生的溢出错误。 ```csharp int intValue = 32768; // 大于short最大值 try { short shortValue = checked((short)intValue); Console.WriteLine(shortValue); } catch (OverflowException ex) { Console.WriteLine($"Overflow Exception: {ex.Message}"); } ``` 这种方式能够有效防止因超出范围而导致程序崩溃的风险[^5]。 --- #### 方法三:采用 `Convert.ToInt16()` 方法进行转换 虽然此方法本质上也是实现了强制类型转换的功能,但它提供了额外的安全保障机制,并且更易于阅读理解。 ```csharp int intValue = 32767; short shortValue = Convert.ToInt16(intValue); Console.WriteLine(shortValue); ``` 然而同样要注意输入参数是否处于合法区间之内;一旦越界,则会抛出相应的异常信息[^3]。 --- ### 总结 以上三种途径均可满足从 `int` 向 `short` 类型转变的需求,但在实际应用过程中应充分考虑源数据的实际大小以及目标环境的具体需求等因素的影响。对于那些可能存在潜在风险的操作场景而言,推荐优先选用带有保护措施的技术手段如 `checked` 或者 `Convert.ToInt16()` 等形式加以处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值