data_to_encode = [
    "Test",
    True,
    1.5,
    1,
    "TRUE",
    False,
    0.0,
    0
]

def intToBytes(i):
    return i.to_bytes(4, byteorder="little", signed=True)

def bytesToInt(b):
    return int.from_bytes(b, byteorder="little", signed=True)

def encode(data):
    encoded_bytes = b""

    encoded_bytes += intToBytes(len(data))

    for d in data:
        if type(d) == int:
            encoded_bytes += intToBytes(1)
            encoded_bytes += intToBytes(d)
        elif type(d) == float:
            encoded_bytes += intToBytes(4)
            encoded_bytes += intToBytes(int(d*10000))
        elif type(d) == str:
            encoded_bytes += intToBytes(2)
            encoded_bytes += intToBytes(len(d))
            encoded_bytes += d.encode("utf-8")
        elif type(d) == bool:
            encoded_bytes += intToBytes(3)
            encoded_bytes += intToBytes(int(d))

    print(encoded_bytes)
    return encoded_bytes

def decode(encoded_bytes):
    data = []
    bytes_read = 0

    array_length = bytesToInt(encoded_bytes[bytes_read:bytes_read+4])
    bytes_read += 4

    for _ in range(array_length):
        data_type = bytesToInt(encoded_bytes[bytes_read:bytes_read+4])
        bytes_read += 4

        if data_type == 1:
            data.append(bytesToInt(encoded_bytes[bytes_read:bytes_read+4]))
            bytes_read += 4
        elif data_type == 4:
            data.append(bytesToInt(encoded_bytes[bytes_read:bytes_read+4])/10000)
            bytes_read += 4
        elif data_type == 2:
            string_length = bytesToInt(encoded_bytes[bytes_read:bytes_read+4])
            bytes_read += 4
            data.append(encoded_bytes[bytes_read:bytes_read+string_length].decode("utf-8"))
            bytes_read += string_length
        elif data_type == 3:
            data.append(bool(bytesToInt(encoded_bytes[bytes_read:bytes_read+4])))
            bytes_read += 4
        else:
            raise ValueError("Unknown data type")

    return data

with open("testowe_dane.arr", "wb") as f:
    f.write(encode(data_to_encode))

#with open("testowe_dane_mixed.arr", "rb") as f:
#    print(decode(f.read()))

#with open("TESTOWE_DANE_ZMIANY.ARR", "rb") as f:
#    print(decode(f.read()))