1*a67afe4dSAndroid Build Coastguard Worker#!/usr/bin/env python 2*a67afe4dSAndroid Build Coastguard Worker 3*a67afe4dSAndroid Build Coastguard Worker""" 4*a67afe4dSAndroid Build Coastguard WorkerByte packing and unpacking utilities. 5*a67afe4dSAndroid Build Coastguard Worker 6*a67afe4dSAndroid Build Coastguard WorkerCopyright (C) 2017-2020 Cosmin Truta. 7*a67afe4dSAndroid Build Coastguard Worker 8*a67afe4dSAndroid Build Coastguard WorkerUse, modification and distribution are subject to the MIT License. 9*a67afe4dSAndroid Build Coastguard WorkerPlease see the accompanying file LICENSE_MIT.txt 10*a67afe4dSAndroid Build Coastguard Worker""" 11*a67afe4dSAndroid Build Coastguard Worker 12*a67afe4dSAndroid Build Coastguard Workerfrom __future__ import absolute_import, division, print_function 13*a67afe4dSAndroid Build Coastguard Worker 14*a67afe4dSAndroid Build Coastguard Workerimport struct 15*a67afe4dSAndroid Build Coastguard Worker 16*a67afe4dSAndroid Build Coastguard Worker 17*a67afe4dSAndroid Build Coastguard Workerdef unpack_uint32be(buffer, offset=0): 18*a67afe4dSAndroid Build Coastguard Worker """Unpack an unsigned int from its 32-bit big-endian representation.""" 19*a67afe4dSAndroid Build Coastguard Worker return struct.unpack(">I", buffer[offset:offset + 4])[0] 20*a67afe4dSAndroid Build Coastguard Worker 21*a67afe4dSAndroid Build Coastguard Worker 22*a67afe4dSAndroid Build Coastguard Workerdef unpack_uint32le(buffer, offset=0): 23*a67afe4dSAndroid Build Coastguard Worker """Unpack an unsigned int from its 32-bit little-endian representation.""" 24*a67afe4dSAndroid Build Coastguard Worker return struct.unpack("<I", buffer[offset:offset + 4])[0] 25*a67afe4dSAndroid Build Coastguard Worker 26*a67afe4dSAndroid Build Coastguard Worker 27*a67afe4dSAndroid Build Coastguard Workerdef unpack_uint16be(buffer, offset=0): 28*a67afe4dSAndroid Build Coastguard Worker """Unpack an unsigned int from its 16-bit big-endian representation.""" 29*a67afe4dSAndroid Build Coastguard Worker return struct.unpack(">H", buffer[offset:offset + 2])[0] 30*a67afe4dSAndroid Build Coastguard Worker 31*a67afe4dSAndroid Build Coastguard Worker 32*a67afe4dSAndroid Build Coastguard Workerdef unpack_uint16le(buffer, offset=0): 33*a67afe4dSAndroid Build Coastguard Worker """Unpack an unsigned int from its 16-bit little-endian representation.""" 34*a67afe4dSAndroid Build Coastguard Worker return struct.unpack("<H", buffer[offset:offset + 2])[0] 35*a67afe4dSAndroid Build Coastguard Worker 36*a67afe4dSAndroid Build Coastguard Worker 37*a67afe4dSAndroid Build Coastguard Workerdef unpack_uint8(buffer, offset=0): 38*a67afe4dSAndroid Build Coastguard Worker """Unpack an unsigned int from its 8-bit representation.""" 39*a67afe4dSAndroid Build Coastguard Worker return struct.unpack("B", buffer[offset:offset + 1])[0] 40*a67afe4dSAndroid Build Coastguard Worker 41*a67afe4dSAndroid Build Coastguard Worker 42*a67afe4dSAndroid Build Coastguard Workerif __name__ == "__main__": 43*a67afe4dSAndroid Build Coastguard Worker # For testing only. 44*a67afe4dSAndroid Build Coastguard Worker assert unpack_uint32be(b"ABCDEF", 1) == 0x42434445 45*a67afe4dSAndroid Build Coastguard Worker assert unpack_uint32le(b"ABCDEF", 1) == 0x45444342 46*a67afe4dSAndroid Build Coastguard Worker assert unpack_uint16be(b"ABCDEF", 1) == 0x4243 47*a67afe4dSAndroid Build Coastguard Worker assert unpack_uint16le(b"ABCDEF", 1) == 0x4342 48*a67afe4dSAndroid Build Coastguard Worker assert unpack_uint8(b"ABCDEF", 1) == 0x42 49