2012-10-29 62 views
5

Tôi đã tìm thấy điều này post về cách mã hóa dữ liệu ascii thành bộ ký tự GSM 7 bit, làm cách nào để giải mã ký tự GSM 7 bit một lần nữa (đảo ngược lại thành ascii)?giải mã 7-bit GSM

+0

làm ngược lại .... –

+0

bạn bị kẹt ở đâu – monkut

Trả lời

3

Đối 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ó một giải pháp rất đơn giản:

Chuyển đổi hex trong octet nhị phân Đặt mỗi octet trong một mảng nhưng theo thứ tự ngược (toàn bộ octet, không phải là bit) bởi vì đó là cách họ được gửi đi. Đọc chuỗi từ phải sang trái trong 7 nhóm bit Số là mã nhân vật trong GSM 7 bit bảng

Ví dụ:

C7F7FBCC2E03 là viết tắt của 'Google'

Chuỗi theo thứ tự ngược lại là

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

sáu octet là

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

Các septets là

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

đọc rồi từ phải sang trái là:

Septet-thập phân dũng cảm-Char trong GSM 7bit bảng

1000111-71-G

1101111-111-o

1.101.111-111-o

1100111-103-g

1101100-108-l

1100101-101-e

Huỷ các 0000000 giá trị cuối cùng

5

Ví dụ:

C7F7FBCC2E03 là viết tắt của '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)]) 

in (gsm7bitdecode ('C7F7FBCC2E03'))

Google

+1

Cũng làm việc cho Python 2.7.11 –

0

Tôi đã viết such decoder trong c cho thiết bị 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; 
}