writing a 1024 bits length decimal number in a binary file with python
我实际上得到了一个1024位长的十进制数(代表2048位RSA密钥的一半)。
然后我想把这个数字写进一个二进制文件,例如,这个文件的字节将直接代表这个数字。
例如,我计算了如何使用长数字"4444",例如:
1 2 3 | with open('test','wb') as f: for b in struct.pack('>L',4444): f.write(b) |
然后在二进制文件中得到这些字节:00 00 11 5C
但是,对于长数字(比如1024位长的数字),我如何才能这样做呢?
谢谢你的回答!
您可以将任何正的python整数视为base-256编码的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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') |
它为
输出:
1 2 3 4 5 6 7 | 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 |
1 2 | >>> 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' |