Я работаю над проектом Python 3, который требует от меня обработки файла как int
блоков. На этом пути используется много преобразований и преобразований типов данных, и существует проблема с одним из приведений. Это происходило следующим образом:
byte strings -> int -> (a data type from DLL library) -> strings (stored at database, looked like int) -> int -> byte strings
(все из которых находятся в блоках, байтных строковых блоках, целых блоках и строковых блоках)
Все кастинги прошли все в порядке до последнего блока, строка байта которого оказалась неправильной.
Преобразование: byte string -> int -> (DLL data type)
...
self.BLOCK_SIZE = 12
...
with open(os.path.join("./uploads", filename), "rb") as f:
bytes = f.read(self.BLOCK_SIZE)
#this is to split to 12 bytes int blocks
while bytes:
#print("bytes", bytes)
mytext = int.from_bytes(bytes, byteorder="big")
#print("inttext", mytext)
#this is the DLL data type, I already crosschecked, it worked fine
myblock = Element(self.pairing, Zr, value=mytext)
file_blocks.append(myblock)
bytes = f.read(self.BLOCK_SIZE)
...
Преобразование: string -> int -> byte string
for i in data["file_blocks"]:
a += int(i).to_bytes(BLOCK_SIZE, byteorder="big")
print(int(i).to_bytes(BLOCK_SIZE, byteorder="big"))
print(a)
b' molestie eu'
b', feugiat in'
b', orci. In h'
b'ac habitasse'
b' platea dict'
b'\x00\x00\x00\x00\x00\x00\x00umst.'
Последний блок int:
504347456558
Я подозреваю, что это проблема из-за приведения значений int
к byte
различной длины, в результате чего int
будет читать как BLOCK_SIZE
длина байта, а не наименьший возможный байт. Что я могу сделать, чтобы этого не случилось?
Мое текущее временное решение - просто strip
нулевых байтов. Есть ли более элегантное решение?
Спасибо!