【问题标题】:Python - Decode GSM SMS message in PDUPython - 解码 PDU 中的 GSM SMS 消息
【发布时间】:2014-01-14 18:02:55
【问题描述】:

我收到类似 PDU 的消息,但我只收到消息“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"

我需要知道转换为“Hi”的格式是什么格式(“C834”)。我怎么可能把它翻译成人类可读的语言?

最好的问候,

【问题讨论】:

    标签: python sms pdu


    【解决方案1】:

    SMS 消息是 7 位 ASCII 打包成一个 8 位流。您可以阅读格式in section 6.1 of the specification (pdf)

    在您的示例中,“C8 34”等于:

    Hex Binary
    C8  11001000
    34  00110100
    

    当使用文档中的规则进行拆分时,它看起来像这样:

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

    要解析这个,你想做这样的事情:

    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
    

    不是最优雅的解决方案,但它应该可以工作。 Here's a JavaScript implementation 这也可能有所帮助。

    【讨论】:

    • 嗨,盖兹戴维森!谢谢回复。还有一个问题。如何转换单词“你好吗?”到“(0xC8、0xF7、0x1D、0x14、0x96、0x97、0x41、0xF9、0x77、0xFD、0x07)”?
    • 反过来做同样的事情:取一个 7 位 ASCII 字符并将其向左移动 bitcount (0) 个位置,将其添加到 number 并将 bitcount 增加 7。 if bitcount &gt; 8 然后 output.append(number%256),然后将 number 向右移动 8 位以丢弃这 8 位,将 bitcount 减少 8。重复直到用完字符。
    【解决方案2】:

    有一个非常简单的解决方案:

    将十六进制转换为二进制八位字节 将每个八位字节放入一个数组中,但处于反向模式(整个八位字节,而不是位) 以 7 位组从右到左读取字符串 该数字是GSM 7位表中的字符代码

    例如:

    C7F7FBCC2E03 代表“谷歌”

    倒序的字符串是

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

    六个八位字节是

    00000011-00101110-11001100-11111011-11110111-11000111

    七重奏是

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

    那么从右到左依次是:

    GSM 7 位表中的 septet-decimal valor-Char

    1000111-71-G

    1101111-111-o

    1101111-111-o

    1100111-103-g

    1101100-108-l

    1100101-101-e

    丢弃最后的 0000000 值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多