def write_varint(outfile, value): '''Writes a varint to a file. @param outfile: the file-like object to write to. It should have a write() method. @returns the number of written bytes. ''' # there is a big difference between 'write the value 0' (this case) and # 'there is nothing left to write' (the false-case of the while loop) if value == 0: outfile.write(ZERO_BYTE) return 1 written_bytes = 0 while value > 0: to_write = value & 0x7f value = value >> 7 if value > 0: to_write |= 0x80 outfile.write(byte(to_write)) written_bytes += 1 return written_bytes
def read_random_bits(nbits): '''Reads 'nbits' random bits. If nbits isn't a whole number of bytes, an extra byte will be appended with only the lower bits set. ''' nbytes, rbits = divmod(nbits, 8) # Get the random bytes randomdata = os.urandom(nbytes) # Add the remaining random bits if rbits > 0: randomvalue = ord(os.urandom(1)) randomvalue >>= (8 - rbits) randomdata = byte(randomvalue) + randomdata return randomdata