2014-12-01 5 views
1

파이썬 3에서 이진수로 파일에 정수를 쓰려면 어떻게해야합니까?파이썬에서 파일에 이진수로 정수 쓰기

예를 들어, 6277101735386680763835789423176059013767194773182842284081을 정확히 24 바이트 (부호없는, 나는 양수로만 작업 할 것입니다)의 이진 파일로 작성하고 싶습니다. 어떻게해야합니까?

struct.pack("i", 6277101735386680763835789423176059013767194773182842284081) 

이 좀 다른 형식 ("L", "Q")와 같은 시도

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

결과,하지만 그 또한 오류가 발생할 :

나는 다음 시도
struct.error: argument out of range 

정수를 정확하게 24 바이트로 변환 할 수 있다면, 어떻게해야 할지를 알고 있기 때문에 파일에 쓸 수 있습니다. 그러나 정수를 바이트로 변환 할 수 없습니다.

또한 정수 당 정확히 24 바이트가 쓰여지는 것을 어떻게 확인합니까? 나는 또한 더 작은 숫자 (1000, 2000, 1598754, 12)를 쓸 것이지만 그것도 24 바이트를 가져야한다.

그리고 나중에 어떻게 파일에서 정수를 다시 읽을 수 있습니까?

+0

http://code.activestate.com/recipes/576617-converting-arbitrary-size-python- 정수/팩/ –

답변

1

당신은

x = value & 0xFF 

으로 최하위 바이트를 추출 할 수 있으며

value = value >> 8 

24 시간이 당신에게 바이트를 줄 것이다이 절차를 반복하여 수에서 해당 바이트를 제거 할 수 있습니다.

또한

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

는 한 번에 4 바이트를 처리하고 함께 예를 들어, 바이트 이상을 복용하여이 과정을 속도를 높일 수 있습니다. 당신이 할 수있는 파이썬 3으로

+0

는'chr (value & 0xFF)'를 만들고 싶지만, 내 대답은이 대답에 찬성하고 (내 +1은) 잘못되었다. –

2

다음

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 = "big"은 이미 이것을 나타 냅니까? – Dasherman

+0

아니요, 읽기 부분에는 제한이 없습니다. 파일 내용은 숫자로 변환됩니다. 처음 24 바이트 만 읽으려면'file.read()'를'file.read() [: 24]'로 대체하십시오. 'byteorder = 'big''은 숫자를 저장하는 방법에 관한 규칙입니다. http://en.wikipedia.org/wiki/Endianness –

+0

file.read (24)도 잘 동작 할 것입니다. – Dasherman

관련 문제