7

アスキーデータを7ビットGSM文字セットにエンコードする方法に関するこの投稿を見つけました。7ビットGSM文字を再度デコードする(アスキーに戻す)にはどうすればよいですか?

4

4 に答える 4

8

例えば:


C7F7FBCC2E03は「Google」 Python3.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'))

グーグル

于 2015-06-16T11:31:50.297 に答える
3

非常に簡単な解決策があります:

16進数を2進オクテットに変換する各オクテットを配列に入れますが、逆の順序(ビットではなくオクテット全体)にします。これが送信方法だからです。文字列を右から左に7ビットグループで読み取ります番号はGSM7ビットテーブルの文字コードです

例えば:

C7F7FBCC2E03は「Google」の略です

逆順の文字列は

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

6オクテットは

00000011-00101110-11001100-11111011-11110111-11000111

セプテットは

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

次に、右から左に読んでください。

セプテット-10進勇気-GSM7ビットテーブルの文字

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

私はopenwrtデバイス用にcでそのようなデコーダーを書きました:

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 に答える