2014-12-01 11 views
1

Как написать целые числа в файл в двоичном формате в Python 3?Запись целых чисел в двоичном файле в python

Например, я хочу написать 6277101735386680763835789423176059013767194773182842284081 файлу в двоичном виде в точности 24 байта (без знака, я буду работать только с положительными целыми числами). Как я могу это сделать? Я попробовал следующее:

struct.pack("i", 6277101735386680763835789423176059013767194773182842284081) 

Это приводит к

ValueError: cannot fit 'int' into an index-sized integer 

Я попробовал то же самое с некоторыми другими форматами ("L", "Q"), но те же привести к ошибкам:

struct.error: argument out of range 

Если бы я мог преобразовать целое число в ровно 24 байта, я мог бы записать его в файл, так как я знаю, как это сделать. Однако я не могу преобразовать целые числа в байты.

Кроме того, как я могу убедиться, что ровно 24 байта записаны для целого числа? Я также буду писать меньшие числа (1000, 2000, 1598754, 12), однако они также должны принимать 24 байта.

И как я могу снова прочитать целые числа из файла?

+0

http://code.activestate.com/recipes/576617-converting-arbitrary-size-python- integers-to-packe/ –

ответ

1

Вы можете извлечь младшие байты с

x = value & 0xFF 

и вы можете удалить эти байты из числа с

value = value >> 8 

Повторив эту процедуру 24 раз дадут вам байты.

Вы также можете ускорить этот процесс, беря больше байт, например, с

x = value & 0xFFFFFFFF 
value = value >> 32 

вы обрабатываете 4 байта за раз.

+0

может захотеть сделать 'chr (value & 0xFF)', но я удалил свой ответ в пользу этого ответа (и + 1 вы) (поскольку мой был неправ ... Я действительно не читал вопрос права) –

2

С Python 3 вы можете сделать следующее:

i = 6277101735386680763835789423176059013767194773182842284081 
with open('out.bin', 'wb') as file: 
    file.write((i).to_bytes(24, byteorder='big', signed=False)) 

with open('out.bin', 'rb') as file: 
    j = int.from_bytes(file.read(), byteorder='big') 

print(j) 

Выход:

$ python3 tiny.py 
6277101735386680763835789423176059013767194773182842284081 
+0

Почему вам не нужно указывать, что 24 байта следует читать из файла? Значит ли byteorder = "большой" это? – Dasherman

+0

Нет, в прочитанной части нет предела. Содержимое файла будет преобразовано в число. Если вы хотите прочитать только первые 24 байта, замените 'file.read()' на 'file.read() [: 24]'. 'byteorder = 'big'' - это соглашение о том, как хранить номера http://en.wikipedia.org/wiki/Endianness –

+0

Я вижу, file.read (24) тоже будет работать, не так ли? – Dasherman