【问题标题】:decode 7-bit GSM解码 7 位 GSM
【发布时间】:2012-10-19 07:36:16
【问题描述】:

我发现了这个post,关于如何将 ascii 数据编码为 7 位 GSM 字符集,我将如何再次解码 7 位 GSM 字符(将其反转回 ascii)?

【问题讨论】:

    标签: python encode codec gsm


    【解决方案1】:

    对于 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 {}
    

    【讨论】:

      【解决方案2】:

      有一个非常简单的解决方案:

      将十六进制转换为二进制八位字节 将每个八位字节放入一个数组中,但顺序相反(整个八位字节,而不是位),因为这是发送它们的方式。以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 值

      【讨论】:

        【解决方案3】:

        例如:

        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'))

        谷歌

        【讨论】:

        • 也适用于 Python 2.7.11
        【解决方案4】:

        我在 c 中为 openwrt 设备写了such decoder

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多