51 lines
1.1 KiB
Plaintext
51 lines
1.1 KiB
Plaintext
|
|
def encode(data):
|
||
|
|
if not data:
|
||
|
|
return
|
||
|
|
l = len(data)
|
||
|
|
if l % 2 != 0:
|
||
|
|
return None
|
||
|
|
ret = bytearray()
|
||
|
|
for i in range(0, l, 2):
|
||
|
|
usTmp = data[i] << 8
|
||
|
|
usTmp += data[i + 1]
|
||
|
|
ucByte = ((usTmp >> 12) & 0xff)
|
||
|
|
|
||
|
|
if i >= l - 2:
|
||
|
|
ucByte |= ((1 << 5) & 0xff)
|
||
|
|
if i < 2:
|
||
|
|
ucByte |= ((1 << 6) & 0xff)
|
||
|
|
a = ((2 << 6) & 0xff)
|
||
|
|
a += ((usTmp >> 6) & 0x3f)
|
||
|
|
b = ((3 << 6) & 0xff)
|
||
|
|
b += (usTmp & 0x3f)
|
||
|
|
ret.append(ucByte)
|
||
|
|
ret.append(a)
|
||
|
|
ret.append(b)
|
||
|
|
return ret
|
||
|
|
|
||
|
|
def decode(data):
|
||
|
|
if not data:
|
||
|
|
return
|
||
|
|
l = len(data)
|
||
|
|
if l % 3 != 0:
|
||
|
|
return None
|
||
|
|
ret = bytearray()
|
||
|
|
for i in range(0, l, 3):
|
||
|
|
val = data[i]
|
||
|
|
usTmp = (val & 0x0f)
|
||
|
|
|
||
|
|
usTmp <<= 6
|
||
|
|
val = data[i + 1]
|
||
|
|
a = (val & 0x3f)
|
||
|
|
usTmp += a
|
||
|
|
|
||
|
|
usTmp <<= 6
|
||
|
|
val = data[i + 2]
|
||
|
|
b = (val & 0x3f)
|
||
|
|
usTmp += b
|
||
|
|
|
||
|
|
a = (usTmp >> 8) & 0xff
|
||
|
|
b = (usTmp & 0xff)
|
||
|
|
ret.append(a)
|
||
|
|
ret.append(b)
|
||
|
|
return ret
|