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
Trả lời
Đố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 {}
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
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'))
Cũng làm việc cho Python 2.7.11 –
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;
}
làm ngược lại .... –
bạn bị kẹt ở đâu – monkut