我发现这篇关于如何将 ascii 数据编码为 7 位 GSM 字符集的帖子,我将如何再次解码 7 位 GSM 字符(将其反转回 ascii)?
问问题
14324 次
4 回答
8
例如:
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)])
打印(gsm7bitdecode('C7F7FBCC2E03'))
谷歌
于 2015-06-16T11:31:50.297 回答
3
有一个非常简单的解决方案:
将十六进制转换为二进制八位位组 将每个八位位组放入一个数组中,但顺序相反(整个八位位组,而不是位),因为这是发送它们的方式。以7位组从右到左读取字符串数字是GSM 7位表中的字符代码
例如:
C7F7FBCC2E03 代表“谷歌”
逆序的字符串是
03-2E-CC-FB-F7-C7
六个八位字节是
00000011-00101110-11001100-11111011-11110111-11000111
七重奏是
000000-1100101-1101100-1100111-1101111-1101111-1000111
然后从右到左阅读是:
GSM 7 位表中的 septet-decimal valor-Char
1000111-71-G
1101111-111-o
1101111-111-o
1100111-103-g
1101100-108-l
1100101-101-e
丢弃最后的 0000000 值
于 2014-01-14T14:18:52.957 回答
2
对于 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 {}
于 2012-10-30T00:40:40.307 回答
0
我在 c 中为 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;
}
于 2015-11-01T20:17:59.197 回答