0

我收到类似 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”)。我怎么可能把它翻译成人类可读的语言?

此致,

4

2 回答 2

5

SMS 消息是 7 位 ASCII 打包成一个 8 位流。您可以在规范 (pdf) 的第 6.1 节中阅读有关格式的信息

在您的示例中,“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

不是最优雅的解决方案,但它应该可以工作。这是一个可能也有帮助的 JavaScript 实现。

于 2013-10-23T01:19:16.627 回答
3

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

将十六进制转换为二进制八位位组 将每个八位位组放入一个数组中,但采用反向模式(整个八位位组,而不是位) 以 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 值

于 2014-01-14T09:54:57.340 回答