Преобразование из int в байт пошло не так в Python 3 - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над проектом 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 нулевых байтов. Есть ли более элегантное решение?

Спасибо!

...