我编写了一个程序来解码 CDMA 3GPP2 点对点 SMS 消息。我在互联网上找到的几个 CDMA PDU 十六进制字符串上对其进行了测试,效果非常好。然而,当我尝试在 Android 平台上的所有传入短信上实现它时,它总是失败。
我查看了传入的 PDU,它似乎不符合我习惯看到的模式。谁能解释一下这个 PDU 的格式,或者我缺少什么来正确解码这个 PDU?是否有其他我没有考虑到的 header 或字段?
从我手机上收到的短信中提取的 PDU 示例:
000000000000100200000000000000000A36373839313031363734000000000000000000001B000310864D000306120624205611010B104C2CF9F3F5EBD73E7000
我发现并测试我的解析器的所有 CDMA pdu 看起来都更像:
00000210020207028CE95DCC65800601FC08150003168D3001061024183060800306101004044847
运营商:Verizon
手机:运行 Android 2.3.3
Samsung Galaxy S Fascinate
最佳答案
请参阅 $SDK/sources/android-16/com/android/internal/telephony/cdma/SmsMessage 中的 javadoc:
/**
* Creates byte array (pseudo pdu) from SMS object.
* Note: Do not call this method more than once per object!
*/
...所以它不遵循任何特定的 CDMA 标准。不过你可以解码它;所以在精美的 ASCII 艺术中:-
000000000000100200000000000000000A36373839313031363734000000000000000000001B000310864D000306120624205611010B104C2CF9F3F5EBD73E7000
--------messageType --digitMode --------bearerReply ------------------------------------------------------bearer data
--------teleService --ton --------------------src --replySeqNo --messageID --msts --userdata
--------serviceCategory --errorClass --len --XX--len --len
--numberMode --causeCode ------ ------------2012/06/24 20:56:11
--npi --------bearerDataLength ----------------------userdata
--len
请注意,我认为您在消息中犯了剪切/粘贴错误 - 标记为“XX”的 00 字节我认为不应该在那里 - 幸运的是,很容易找到日期并向后工作。这是一条来自 6789101674 的消息,其中包含用户数据:
104C2CF9F3F5EBD73E7000,前五位表明它是7位编码的(0x02)。将用户数据的剩余部分向左移动 5 位后,我们得到:
09859f3e7ebd7ae7ce00
--len(septets) 9 septets == 63 bits, so we expect 8 bytes of body
----------------7bit-body
所以你的 7bit-body 解码后是“Bggguuugg”。
关于android - Android 上的 CDMA PDU 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182650/