Esempio n. 1
0
def encode_7b_cbs(txt):
    """translates the unicode string `txt' into a tuple of page(s) 
    containing GSM 7 bit characters, ready for broadcast
    
    a page is a 2-tuple: 82-bytes buffer, message length (<= 82)
    """
    pages, page, cnt = [], [], 0
    # check the number of 7 bit characters required for txt
    for c in txt:
        if c in _GSM7bLUTInv:
            c_cnt = 1
        elif c in _GSM7bExtLUTInv:
            c_cnt = 2
        else:
            raise (PycrateErr('invalid GSM 7 bit char: %r' % c))
        if cnt + c_cnt < 94:
            page.append(c)
            cnt += c_cnt
        else:
            # encode the current page to pages
            enc = encode_7b(''.join(page))[0]
            enc_len = len(enc)
            if enc_len < 82:
                enc += (82 - enc_len) * b'\0'
            pages.append((enc, enc_len))
            # restart filling current page
            page, cnt = [c], c_cnt
    # pad and append last page
    if page:
        last = encode_7b(''.join(page))[0]
        last_len = len(last)
        last += (82 - last_len) * b'\0'
        pages.append((last, last_len))
    # return the tuple of pages
    return tuple(pages)
Esempio n. 2
0
def encode_7b(txt):
    """translates the unicode string `txt' to a GSM 7 bit characters buffer
    """
    arr, cnt = [], 0
    for c in reversed(txt):
        try:
            arr.append((TYPE_UINT, _GSM7bLUTInv[c], 7))
        except KeyError:
            try:
                arr.append((TYPE_UINT, _GSM7bExtLUTInv[c], 7))
            except KeyError:
                raise (PycrateErr('invalid GSM 7 bit char: %r' % c))
            else:
                # add an escape char
                arr.append((TYPE_UINT, 27, 7))
                cnt += 2
        else:
            cnt += 1
    # check the length in bits and add padding bits
    pad = (8 - (7 * len(arr)) % 8) % 8
    arr.insert(0, (TYPE_UINT, 0, pad))
    if python_version < 3:
        return ''.join(reversed(pack_val(*arr)[0])), cnt
    else:
        return bytes(reversed(pack_val(*arr)[0])), cnt
Esempio n. 3
0
def encode_7b(txt, off=0):
    """translates the unicode string `txt' to a GSM 7 bit characters buffer
    
    Args:
        txt (utf8 str): text string to encode
        off (uint): bit offset
     
    Returns:
        encoded buffer and septet count (bytes, uint)
    """
    arr, cnt = [], 0
    for c in reversed(txt):
        try:
            arr.append( (TYPE_UINT, _GSM7bLUTInv[c], 7) )
        except KeyError:
            try:
                arr.append( (TYPE_UINT, _GSM7bExtLUTInv[c], 7) )
            except KeyError:
                raise(PycrateErr('invalid GSM 7 bit char: %r' % c))
            else:
                # add an escape char
                arr.append( (TYPE_UINT, 27, 7) )
                cnt += 2
        else:
            cnt += 1
    # check the length in bits and add padding bits
    pad = ((8-(7*len(arr)+off)%8)%8)
    arr.insert(0, (TYPE_UINT, 0, pad))
    if python_version < 3:
        return ''.join(reversed(pack_val(*arr)[0])), cnt
    else:
        return bytes(reversed(pack_val(*arr)[0])), cnt
Esempio n. 4
0
 def __init__(self, *args, **kw):
     if 'IE' in kw:
         if isinstance(kw['IE'], (Element, CSN1Obj)):
             self._IE = kw['IE'].clone()
         elif self._SAFE_STAT:
             raise(PycrateErr('IE [__init__]: IE type is {0}, expecting Element'\
                   .format(type(kw['IE']).__name__)))
     Envelope.__init__(self, *args, **kw)
Esempio n. 5
0
 def _from_char(self, char):
     if self.get_trans():
         return
     self[0]._from_char(char)
     if self[0]():
         # long format
         self[1]._name = 'Len'
         self[1]._from_char(char)
         self.append(Uint('Val', bl=self[1]() << 3))
         self[2]._from_char(char)
         val = self[2]()
         if val > self.MAXLEN:
             raise (PycrateErr('Length too long, %i' % self[2]()))
         elif val == 0:
             raise (PycrateErr('Undefinite length'))
     else:
         # short format
         self[1]._from_char(char)
Esempio n. 6
0
 def set_val(self, val):
     if 0 <= val < 0x80:
         self[0].set_val(val)
     elif 0x80 <= val < 0x100:
         self[0].set_val(0x81)
         self[1].set_bl(8)
         self[1].set_val(val)
     elif 0x100 <= val < 0x10000:
         self[0].set_val(0x82)
         self[1].set_bl(16)
         self[1].set_val(val)
     elif 0x10000 <= val < 0x1000000:
         self[0].set_val(0x83)
         self[1].set_bl(24)
         self[1].set_val(val)
     else:
         raise (PycrateErr('invalid length'))