2016-04-07 6 views
0

Ich habe tatsächlich eine 1024 Bit Länge Dezimalzahl (die Hälfte eines RSA-Schlüssels von 2048 Bit) erhalten.schreiben eine 1024 Bit Länge Dezimalzahl in einer Binärdatei mit Python

Ich möchte dann diese Nummer in eine Binärdatei schreiben, z. Die Bytes dieser Datei werden direkt die Nummer darstellen.

ich zum Beispiel gedacht, wie so mit einer langen Reihe zu tun "4444" zum Beispiel:

with open('test','wb') as f: 
    for b in struct.pack('>L',4444): 
     f.write(b) 

i dann diese Bytes in der Binärdatei erhalten: 00 00 11 5c

jedoch Wie kann ich das für lange Zahlen tun, wie eine 1024 Bit lange?

danke für jede antwort!

+0

In welchem ​​Format haben Sie die Dezimalzahl? Ist es eine 'str' von Dezimalziffern? –

+1

Mögliche Duplikate: http://stackoverflow.com/questions/4358285/is-there-a-faster-way-to-convert-an-arbitrary-large-integer-to-a-big-endian-seque/4358429# 4358429 http://stackoverflow.com/questions/4670350/how-do-i-write-a-long-intege-as-binary-in-python –

+0

ah danke Rob für diejenigen! ich habe die zweite weitergegeben, weil ich gerade 'long integer' gesehen habe und dachte, es wäre lang im Sinne von C type – evoliptic

Antwort

1
>>> binascii.unhexlify('{:0{}x}'.format(19, int(1024/4))) 
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13' 
1

Sie behandeln jede positive Python ganze Zahl als Basis-256-bytestring und zu kodieren und dekodieren man wie folgt aus:

import math 

def hexrepr(b): # bytearray arg 
    return ' '.join(("%02x" % i) for i in b) 

def hexstr(b): # bytearray arg 
    return "'%s'" % ''.join('\\x'+("%02x" % i) for i in b) 

def roundup(n, m): # round n up to nearest whole m 
    if m == 0: 
     return 0 
    else: 
     add = m // abs(m) 
     return ((n+m-add) // m) * m 

def base256_encode(n, minlen=0): # int/long to byte array 
    if n > 0: 
     arr = [] 
     while n: 
      n, rem = divmod(n, 256) 
      arr.append(rem) 
     b = bytearray(reversed(arr)) 
    elif n == 0: 
     b = bytearray(b'\x00') 
    else: 
     raise ValueError 

    if minlen > 0 and len(b) < minlen: # zero padding needed? 
     b = (minlen-len(b)) * '\x00' + b 
    return b 

def base256_decode(a_bytearray): # bytearray to number 
    return reduce(lambda a,i: a*256 + i, a_bytearray, 0) 

n = 4444 # must be unsigned integer 
nbits = int(math.floor(math.log(n, 2)) + 1) # number of bits needed to represent n 
print 'n:', format(n, ',d') 
print('nbits: {}'.format(nbits)) 
print('roundup(nbits, 8): {}'.format(roundup(nbits, 8))) 

encoded = base256_encode(n, roundup(nbits, 8)/8) 
print 'encoded = base256_encode(n, roundup(nbits, 8)/8)' 
print 'hexstr(encoded):', hexstr(encoded) 
print 'encoded:', hexrepr(encoded) 
print 'decoded:', format(base256_decode(encoded), ',d') 

Welche der folgenden für n = 4444 produziert:

Ausgang:

n: 4,444 
nbits: 13 
roundup(nbits, 8): 16 
encoded = base256_encode(n, roundup(nbits, 8)/8) 
hexstr(encoded): '\x11\x5c' 
encoded: 11 5c 
decoded: 4,444 
+0

Nun, die beiden Antworten funktionieren in meinem Fall, und vielen Dank euch beiden! Ich wähle die Antwort von Ignacio (aber Sie haben eine ziemlich beeindruckende Antwort Martineau) für Einfachheit. – evoliptic

Verwandte Themen