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