Python - декодирование SM S-сообщения GSM в PDU
Я получаю сообщение типа 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"
Мне нужно знать формат, какой это формат ("C834"), что переводится как "Привет". Как я могу перевести это на человекочитаемый язык?
С уважением,
2 ответа
SMS-сообщения 7-битные ASCII упакованы в 8-битный поток. Вы можете прочитать о формате в разделе 6.1 спецификации (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
Не самое элегантное решение, но оно должно работать. Вот реализация JavaScript, которая также может помочь.
Есть очень простое решение:
Преобразование шестнадцатеричного числа в двоичные октеты. Поместите каждый октет в массив, но в обратном режиме (весь октет, а не биты). Считайте строку справа налево в 7-битных группах. Число - это код символа в 7-битной таблице GSM.
Например:
C7F7FBCC2E03 означает "Google"
Стрин в обратном порядке
03-2E-CC-FB-F7-C7
Шесть октетов
00000011-00101110-11001100-11111011-11110111-11000111
Септеты
000000-1100101-1101100-1100111-1101111-1101111-1000111
Читайте тогда справа налево:
septet-decimal valor-Char в GSM 7-битной таблице
1000111-71-G
1101111-111-о
1101111-111-о
1100111-103-г
1101100-108-л
1100101-101-е
Отменить последнее значение 0000000