шестнадцатеричное преобразование форматирования строки в python

Я использовал генерацию случайной строки следующим образом (теперь я переключился на этот метод ).

key = '%016x' % random.getrandbits(128) 

Ключ, созданный таким образом, чаще всего является строкой из 32 символов, но как только у меня есть 31 символ.

Это то, чего я не понимаю: почему это 32 символа, а не 16 ? Разве не одна шестнадцатеричная цифра принимает один символ для печати?

Поэтому, если я попрошу %016x – не стоит ли ожидать шестнадцать символов с возможными ведущими нулями?

Почему строка legth не всегда одинакова?

Прецедент

 import random import collections stats = collections.defaultdict(int) for i in range(1000000): key = '%016x' % random.getrandbits(128) length = len(key) stats[length] += 1 for key in stats: print key, ' ', stats[key] 

Печать:

 32 937911 27 1 28 9 29 221 30 3735 31 58123 

2 Solutions collect form web for “шестнадцатеричное преобразование форматирования строки в python”

Да, но формат, который вы используете, не усекает – вы генерируете 128 случайных бит, которые требуют (обычно) 32 шестнадцатеричных цифр, чтобы показать, а %016 означает AT LEAST 16 шестнадцатеричных цифр, но не просто выбрасывает дополнительные вам нужно показать все 128-битное число. Почему бы не генерировать только 64 случайных бита, если это то, что вам действительно нужно? Меньшая работа для случайного генератора И никаких проблем с форматированием.

Чтобы удовлетворить ваше любопытство, длина иногда составляет 31 цифра, потому что 1 раз в 16 верхних 4 бита будет 0; на самом деле 1 раз в 256 все верхние 8 бит будут 0, поэтому вы получите только 30 цифр и т. д. Вы только просили 16 цифр, поэтому форматирование даст наименьшее число, которое> = 16 и не требует обрезание, о котором вы не просили.

Каждый шестнадцатеричный символ от 0 до F содержит 4 бита информации или половину байт. 128 бит – 16 байт, и поскольку для печати байта требуется два шестнадцатеричных символа, вы получаете 32 символа. Таким образом, ваша строка формата должна быть '%032x' которая всегда будет генерировать 32-символьную строку, но не короче.

 jkugelman$ cat rand.py #!/usr/bin/env python import random import collections stats = collections.defaultdict(int) for i in range(1000000): key = '%032x' % random.getrandbits(128) length = len(key) stats[length] += 1 for key in stats: print key, ' ', stats[key] jkugelman$ python rand.py 32 1000000 
  • Как преобразовать int в шестнадцатеричную строку?
  • Python эквивалент Ruby's StringScanner?
  • Как присоединиться к списку строк?
  • Поиск нескольких вхождений строки в строке в Python
  • регулярное выражение python, заменяющее часть согласованной строки
  • в python, как удалить это \ n из строки или списка
  • Почему индекс подрезки за пределами диапазона работает в Python?
  • Нечувствительный к строкам метод разделения строк Python
  • Python - лучший язык программирования в мире.