2013-10-23 2 views
0

내가 메시지 같은 PDU를 수신하고있어,하지만 난 단지 메시지 "C824"나는 어떤 형식의 형식을 알 필요가파이썬 - PDU

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" 

를 수신하고있어에서 디코드 GSM의 SMS 메시지는 "(이입니다 C834 ")"Hi "로 변환됩니다. 어떻게하면 이것을 사람이 읽을 수있는 언어로 번역 할 수 있습니까?

감사합니다.

답변

5

SMS 메시지는 8 비트 스트림으로 7 비트 ASCII로 압축되어 있습니다. 당신은 예를 들어 "C8 34"의 형식 in section 6.1 of the specification (pdf)

에 대해 읽을 수있는 것은 같다 :

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도 도움이 될 수 있습니다.

+0

안녕 Gaz Davidson! 답장을 보내 주셔서 감사합니다. 한 가지 더 묻습니다. "나는 어떠니?"라는 단어를 어떻게 변환 할 수 있습니까? "(0xC8, 0xF7, 0x1D, 0x14, 0x96, 0x97, 0x41, 0xF9, 0x77, 0xFD, 0x07)"? –

+0

같은 일을 역으로하십시오. 7 비트 ASCII 문자를 가져 와서 'bitcount' (0) 자리를 왼쪽으로 이동하고'number '에 추가하고'bitcount '를 7 씩 늘립니다.'if bitcount> 8' then 'output.append (number % 256)'을 실행 한 다음'number '를 8 자리만큼 이동하여 8 비트를 버리십시오.'bitcount'를 8 줄이십시오. 문자가 부족할 때까지 반복하십시오. –

3

아주 쉬운 해결책이있다 :

가에서 문자열을 오른쪽에서 왼쪽으로 읽기 배열이 아니라 역 모드 (전체 옥텟이 아닌 비트) 각 옥텟을 넣어 진 옥텟의 진수 변환은

C7F7FBCC2E03 '는 구글

T 약자 : 7 개 비트 그룹 숫자는 GSM 7 비트 테이블 예컨대

의 문자 코드 그 역순 strin 여섯 개 옥텟

00000011-00101110-11001100-11111011-11110111-11000111

septets이다

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

이다

오른쪽에서 왼쪽으로 다음 읽기

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

되어 있습니다 :

GSM의 7 비트 테이블

1000111-71-G

1101111-111-O의 용기로부터 문자

중선 진수

1101111-111-O

1100111-103-g

1101100-108 -1-

1100101-101-E

마지막 0000000 값을 무시합니다.

+1

"매우 쉬운 해결책이 있습니다." – Lilleman

관련 문제