Python - Decode GSM SMS message in PDU

时间秒杀一切 提交于 2019-12-08 09:50:53

问题


I'm receiving a PDU like message, but I'm only receiving the message "C824"

PDU example, 040C9119898392752300008010610014412202C834

04 - first octet
0C - phone number length
91 - phone number type
198983927523 - phone number
00 - protocol identifier
00 - data coding scheme
80106100144122 - time stamp
02 - message length
C834 - message, i.e. "Hi"

I need to know the format what format is this("C834") that translates to "Hi". How can I possibly translate this to human readable language?

Best Regards,


回答1:


SMS messages are 7-bit ASCII packed into an 8-bit stream. You can read about the format in section 6.1 of the specification (pdf)

In your example "C8 34" is equal to:

Hex Binary
C8  11001000
34  00110100

When split using the rules in the document it looks like this:

Hex Binary
48  1001000 most significant bit is moved to next char's least significant bit
69  1101001 
00  00

To parse this you want to do something like this:

bytes    = (0xC8, 0xF7, 0x1D, 0x14, 0x96, 0x97, 0x41, 0xF9, 0x77, 0xFD, 0x07)
number   = 0
bitcount = 0
output   = ''
for byte in bytes:
    # add data on to the end
    number = number + (byte << bitcount)
    # increase the counter
    bitcount = bitcount + 1
    # output the first 7 bits
    output = output + '%c' % (number % 128)
    # then throw them away
    number = number >> 7
    # every 7th letter you have an extra one in the buffer
    if bitcount == 7:
        output = output + '%c' % (number)
        bitcount = 0
        number = 0
print output

Not the most elegant solution but it should work. Here's a JavaScript implementation that may also help.




回答2:


There is a very easy solution:

Convert the hex in binary octets Put each octet in a array but in reverse mode (the whole octet, not the bits) Read the string from right to left in 7 bits groups The number is the character code in the GSM 7 bit table

For example:

C7F7FBCC2E03 stands for 'Google'

The strin in reverse order is

03-2E-CC-FB-F7-C7

The six octets are

00000011-00101110-11001100-11111011-11110111-11000111

The septets are

000000-1100101-1101100-1100111-1101111-1101111-1000111

Read then from right to left are:

septet-decimal valor-Char in GSM 7bit table

1000111-71-G

1101111-111-o

1101111-111-o

1100111-103-g

1101100-108-l

1100101-101-e

Discard the last 0000000 value



来源:https://stackoverflow.com/questions/19530646/python-decode-gsm-sms-message-in-pdu

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!