2012-10-29 11 views
5

Ho trovato questo post su come codificare i dati ascii in un set di caratteri GSM a 7 bit, come dovrei decodificare di nuovo il carattere GSM a 7 bit (reinserirlo in ascii)?decodifica GSM a 7 bit

+0

fai il contrario .... –

+0

dove sei bloccato? – monkut

risposta

3

Per 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

C'è una soluzione molto semplice:

Converte l'esagono in ottetti binari Inserire ogni ottetto in una matrice, ma in ordine inverso (l'intero ottetto, non i bit) perché è così che vengono inviati. Leggi la stringa da destra a sinistra in 7 gruppi bits Il numero è il codice di carattere nella tabella GSM 7 bit

Ad esempio:

C7F7FBCC2E03 sta per 'Google'

La stringa in ordine inverso è

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

I sei ottetti sono

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

I settetti sono

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

Leggi poi da destra a sinistra sono:

settetto decimale valor-Char in 7bit GSM tavolo

1000111-71-G

1101111-111-o

1.101.111-111-o

1100111-103-g

1101100-108-l

1100101-101-e

Elimina l'ultimo valore 0000000

5

Ad esempio:

C7F7FBCC2E03 sta per "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)]) 

stampa (gsm7bitdecode ('C7F7FBCC2E03'))

Google

+1

Funziona anche per Python 2.7.11 –

0

ho scritto such decoder in c per il dispositivo 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; 
} 
Problemi correlati