2012-10-29 16 views
5

Znalazłem to post, w jaki sposób kodować dane ASCII do 7-bitowego zestawu znaków GSM, jak odszyfrować ponownie 7-bitową postać GSM (cofnąć ją do ascii)?dekodowanie 7-bitowe GSM

+0

zrób odwrotnie ... –

+0

gdzie utknąłeś? – monkut

Odpowiedz

3

Na python2:

import binascii 
gsm = ("@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞ\x1bÆæßÉ !\"#¤%&'()*+,-./:;<=>?" 
     "¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑÜ`¿abcdefghijklmnopqrstuvwxyzäöñüà") 
ext = ("````````````````````^```````````````````{}`````\\````````````[~]`" 
     "|````````````````````````````````````€``````````````````````````") 

def gsm_encode(plaintext): 
    result = [] 
    for c in plaintext: 
     idx = gsm.find(c) 
     if idx != -1: 
      result.append(chr(idx)) 
      continue 
     idx = ext.find(c) 
     if idx != -1: 
      result.append(chr(27) + chr(idx)) 
    return ''.join(result).encode('hex') 

def gsm_decode(hexstr): 
    res = hexstr.decode('hex') 
    res = iter(res) 
    result = [] 
    for c in res: 
     if c == chr(27): 
      c = next(res) 
      result.append(ext[ord(c)]) 
     else: 
      result.append(gsm[ord(c)]) 
    return ''.join(result) 

code = gsm_encode("Hello World {}") 
print(code) 
# 64868d8d903a7390938d853a1b281b29 
print(gsm_decode(code)) 
# Hello World {} 
2

Jest to bardzo proste rozwiązanie:

Konwersja hex oktetów binarnych umieścić każdy bajt w tablicy, ale w odwrotnej kolejności (cały bajt, nie bity) ponieważ w ten sposób są wysyłani. Czytaj ciąg znaków od prawej do lewej w 7 bitów grupami liczba jest kodem znaku w bitowej tabeli

Na przykład GSM 7:

C7F7FBCC2E03 oznacza „Google”

ciąg w odwrotnej kolejności jest

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

sześć oktetów są

00000011-00101110-11001100-11111011-11110111-1 1000111

W septets są

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

Czytaj następnie od prawej do lewej strony to:

septet dziesiętnego Valor-Char w 7bit GSM tabela

1000111-71-G

1101111-111-O

1101111-111-O

1100111-103-g

1101100-108-l

1100101-101-e

Anuluj ostatni 0000000 wartość

5

na przykład:

C7F7FBCC2E03 oznacza "Google"
Python 3.4

def gsm7bitdecode(f): 
    f = ''.join(["{0:08b}".format(int(f[i:i+2], 16)) for i in range(0, len(f), 2)][::-1]) 
    return ''.join([chr(int(f[::-1][i:i+7][::-1], 2)) for i in range(0, len(f), 7)]) 

print (gsm7bitdecode ('C7F7FBCC2E03'))

Google

+1

Działa również w języku Python 2.7.11 –

0

Pisałem such decoder wc dla urządzenia OpenWrt:

uint8_t get_data (char input, uint8_t * output) 
{ 
    if (input - '0' >= 0 && '9' - input >= 0) { 
     * output = input - '0'; 
    } else if (input - 'a' >= 0 && 'f' - input >= 0) { 
     * output = input - 'a' + 10; 
    } else if (input - 'A' >= 0 && 'F' - input >= 0) { 
     * output = input - 'A' + 10; 
    } else { 
     return 1; 
    } 
    return 0; 
} 

uint8_t get_data_pair (const char * input, uint8_t * output) 
{ 
    uint8_t data; 
    if (get_data (* input, &data) != 0) { 
     return 1; 
    } 
    * output = data << 4; 
    if (get_data (* (input + 1), &data) != 0) { 
     return 2; 
    } 
    * output = * output | data; 
    return 0; 
} 

int main (int argc, char * argv []) 
{ 
    if (argc != 2) { 
     fputs ("required argument: hex\n", stderr); 
     return 1; 
    } 

    char * hex = argv[1]; 
    uint16_t data = 0; 
    uint8_t data_length = 0; 

    while (*hex != '\0') { 
     uint8_t new_data; 
     if (get_data_pair (hex, &new_data) != 0) { 
      fprintf (stderr, "invalid hex: bad pair %.2s\n", hex); 
      putchar ('\n'); 
      return 2; 
     } 
     hex += 2; 

     data = new_data << data_length | data; 
     data_length += 8; 

     while (data_length >= 7) { 
      putchar (data & 0x7f); 
      data = data >> 7; 
      data_length -= 7; 
     } 
    } 

    putchar ('\n'); 
    return 0; 
}