2014-10-17 2 views
0

나는 기본적으로 2 진법의 벽인 큰 숫자를 가지고 있습니다. 어떻게 그 숫자를 실제 숫자를 저장하지 않고서 읽을 수있는 원시 바이트로 파일에 쓸 수 있습니까? ? 또한, 파일에있는 원시 바이트를 어떻게 디코딩합니까?숫자를 바이트로

바이너리 : 0b101010011000010000 소수 : 173584 바이트 : ???

+0

입력 예를 표시하십시오. – vaultah

+0

http://pastebin.com/KXpyZJYw – user3023610

+3

\ * Sigh \ * - 입력 사항의 작은 샘플 *을 ** 질문 **에 표시하십시오. – jonrsharpe

답변

0

임의로 긴 비트 시퀀스가 ​​음수가 아닌 기본 2 숫자를 나타내는 경우 해당 비트 중 8 개 그룹은 기본 256 숫자의 숫자를 고려할 수 있으며 파일의 문자열로 쓸 수 있습니다 8 비트 문자. 문자열을 다시 읽은 후 프로세스를 반대로하면이 문자열을 원래의 번호로 다시 디코딩 할 수 있습니다.

다음은 this answer에서 Base 62 conversion in Python으로 파생 된 것입니다.

def base256_encode(n): # non-negative integer to byte string 
    if n > 0: 
     arr = [] 
     while n: 
      n, rem = divmod(n, 256) 
      arr.append(chr(rem)) 
     return ''.join(reversed(arr)) 
    elif n == 0: 
     return '\x00' 
    else: 
     raise ValueError("can't convert negative value to a byte string") 

def base256_decode(s): # (big-endian) byte string to number 
    return reduce(lambda a, c: a*256 + ord(c), s, 0) 

def binrepr(s): # utility 
    return ' '.join(('{:08b}'.format(ord(c))) for c in s) 

n = 173584 
print 'n:', n 

en = base256_encode(n) 
print 'binary bytes:', binrepr(en) 

with open('rawbits.bin', 'wb') as outf: 
    outf.write(en) 

with open('rawbits.bin', 'rb') as inf: 
    print 'read from file:', base256_decode(inf.read()) 

출력 :

n: 173584 
binary bytes: 00000010 10100110 00010000 
read from file: 173584 
0

나는이 도움이되는지 확실하지 않다거나 직접 질문에 대답하는 경우하지만 ...

독점적 파이썬에서 파일을 액세스하려면

너는 단지 그 일을 피클 할 수있다. 이런 식으로 뭔가 : 큰 숫자가 당신의 여가에서 읽을 수 있지만, 나는 그것이 파이썬의 영역의 유용한 외부 될 것이라고 생각하지 않는 파일 'trash.txt'에 저장됩니다

>>> x = 0b0010101011010100101101010010101100001011101010001010101001010110110101011011111111010100100111110101001000100111011101101 
>>> x 
444781385027604204959187557780049645 
>>> import pickle 
>>> pickle.dump(x, open('trash.txt', 'wb')) 
>>> pickle.load(open('trash.txt', 'rb')) 
444781385027604204959187557780049645 

.

관련 문제