summaryrefslogtreecommitdiff
path: root/tasd/utils.py
blob: d1393f2d60c444343cc53dbeedbacf3411f399c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
def readString(buffer: bytearray, index: int, length: int) -> str:
    return buffer[index:index+length].decode("utf8")
def writeString(string: str, buffer: bytearray, index: int) -> None:
    rawstring = string.encode("utf8")
    buffer[index:index+len(rawstring)] = rawstring
def sizeString(string: str) -> int:
    return len(string.encode("utf8"))

def readBytes(buffer: bytearray, index: int, length: int) -> bytes:
    return buffer[index:index+length]
def writeBytes(value: bytes, buffer: bytearray, index: int) -> None:
    buffer[index:index+len(value)] = value

def readUint8(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+1], byteorder="big", signed=False)
def readUint16(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+2], byteorder="big", signed=False)
def readUint24(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+3], byteorder="big", signed=False)
def readUint32(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+4], byteorder="big", signed=False)
def readUint64(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+8], byteorder="big", signed=False)
def readUintN(buffer: bytearray, index: int, size: int) -> int:
    if size == 1:
        return readUint8(buffer, index)
    if size == 2:
        return readUint16(buffer, index)
    if size == 3:
        return readUint24(buffer, index)
    if size == 4:
        return readUint32(buffer, index)
    raise ValueError("Unsuported UintN size", size)

def writeUint8(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+1] = (value & (2 ** 8 - 1)).to_bytes(1, byteorder="big", signed=False)
def writeUint16(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+2] = (value & (2 ** 16 - 1)).to_bytes(2, byteorder="big", signed=False)
def writeUint24(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+3] = (value & (2 ** 24 - 1)).to_bytes(3, byteorder="big", signed=False)
def writeUint32(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+4] = (value & (2 ** 32 - 1)).to_bytes(4, byteorder="big", signed=False)
def writeUint64(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+8] = (value & (2 ** 64 - 1)).to_bytes(8, byteorder="big", signed=False)
def writeUintN(value: int, buffer: bytearray, index: int, size: int) -> None:
    if size == 1:
        return writeUint8(value, buffer, index)
    if size == 2:
        return writeUint16(value, buffer, index)
    if size == 3:
        return writeUint24(value, buffer, index)
    if size == 4:
        return writeUint32(value, buffer, index)
    raise ValueError("Unsuported UintN size", size)

def minUint(value: int) -> int:
    if value < 256:
        return 1
    if value < 65536:
        return 2
    if value < 16777216:
        return 3
    if value < 4294967296:
        return 4
    raise ValueError("Unsupported UInt size", value);


def readInt8(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+1], byteorder="big", signed=True)
def readInt16(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+2], byteorder="big", signed=True)
def readInt24(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+3], byteorder="big", signed=True)
def readInt32(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+4], byteorder="big", signed=True)
def readInt64(buffer: bytearray, index: int) -> int:
    return int.from_bytes(buffer[index:index+8], byteorder="big", signed=True)
def readIntN(buffer: bytearray, index: int, n: int) -> int:
    if n == 1:
        return readInt8(buffer, index)
    if n == 2:
        return readInt16(buffer, index)
    if n == 3:
        return readInt24(buffer, index)
    if n == 4:
        return readInt32(buffer, index)
    raise ValueError("Unsuported IntN size", n)

def writeInt8(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+1] = (value & (2 ** 8 - 1)).to_bytes(1, byteorder="big", signed=True)
def writeInt16(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+2] = (value & (2 ** 16 - 1)).to_bytes(2, byteorder="big", signed=True)
def writeInt24(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+3] = (value & (2 ** 24 - 1)).to_bytes(3, byteorder="big", signed=True)
def writeInt32(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+4] = (value & (2 ** 32 - 1)).to_bytes(4, byteorder="big", signed=True)
def writeInt64(value: int, buffer: bytearray, index: int) -> None:
    buffer[index:index+8] = (value & (2 ** 64 - 1)).to_bytes(8, byteorder="big", signed=True)
def writeIntN(value: int, buffer: bytearray, index: int, size: int) -> None:
    if size == 1:
        return writeInt8(value, buffer, index)
    if size == 2:
        return writeInt16(value, buffer, index)
    if size == 3:
        return writeInt24(value, buffer, index)
    if size == 4:
        return writeInt32(value, buffer, index)
    raise ValueError("Unsuported IntN size", size)

def minInt(value: int) -> int:
    if -0x80 <= value <= 0x7f:
        return 1
    if -0x8000 <= value <= 0x7fff:
        return 2
    if -0x800000 <= value <= 0x7fffff:
        return 3
    if -0x80000000 <= value <= 0x7fffffff:
        return 4
    raise ValueError("Unsupported Int size", value);

def readBoolean(buffer: bytearray, index: int) -> bool:
    if buffer[index] == 1:
        return True
    if buffer[index] == 0:
        return False
    raise ValueError("Invalid Boolean value")
def writeBoolean(bool: bool, buffer: bytearray, index: int) -> None:
    buffer[index] = (1 if bool else 0)