我发现这个post关于如何将ascii数据编码为7位GSM字符集,如何再次解码7位GSM字符(将其反转回ascii)?
发布于 2012-10-30 08:40:40
对于Python2:
import binascii
gsm = ("@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞ\x1bÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?"
"¡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 {}发布于 2015-06-16 19:31:50
例如:
C7F7FBCC2E03代表“谷歌”
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'))
谷歌
发布于 2014-01-14 22:18:53
有一个非常简单的解决方案:
将十六进制转换为二进制八位数,将每个八位数放入一个数组中,但顺序相反(整个八位数,而不是位),因为这是发送它们的方式。从右到左以7位为一组读取字符串,数字为GSM 7位表中的字符代码
例如:
C7F7FBCC2E03代表“谷歌”
相反顺序的字符串是
03-2E-CC-FB-F7-C7
六个二进制八位数是
00000011-00101110-11001100-11111011-11110111-11000111
七重奏是
000000-1100101-1101100-1100111-1101111-1101111-1000111
然后从右到左阅读如下:
GSM7位表中的septet decimal valor-Char
1000111-71-G
1101111-111-o
1101111-111-o
1100111-103-g
1101100-108-l
1100101-101-e
丢弃最后0000000个值
https://stackoverflow.com/questions/13130935
复制相似问题