78 lines
2.2 KiB
Python
78 lines
2.2 KiB
Python
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())) |