xref: /aosp_15_r20/external/libpng/contrib/pngexif/bytepack.py (revision a67afe4df73cf47866eedc69947994b8ff839aba)
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