Как узнать размер строки в байтах python
Перейти к содержимому

Как узнать размер строки в байтах python

  • автор:

Байты (bytes и bytearray)

Python 3 логотип

Байтовые строки в Python — что это такое и с чем это едят? Байтовые строки очень похожи на обычные строки, но с некоторыми отличиями. Попробуем выяснить, с какими.

Что такое байты? Байт — минимальная единица хранения и обработки цифровой информации. Последовательность байт представляет собой какую-либо информацию (текст, картинку, мелодию. ).

Создаём байтовую строку:

   
   Что делать с байтами? Хотя байтовые строки поддерживают практически все строковые методы, с ними мало что нужно делать. Обычно их надо записать в файл / прочесть из файла и преобразовать во что-либо другое (конечно, если очень хочется, то можно и распечатать). Для преобразования в строку используется метод decode:
 Bytearray в python - массив байт. От типа bytes отличается только тем, что является изменяемым. Про него, в общем-то, больше рассказать нечего.

Для вставки кода на Python в комментарий заключайте его в теги

Байтовые строки bytes в Python

Тип данных bytes - это неизменяемые последовательности отдельных байтов. Основные двоичные протоколы основаны на кодировании текста ASCII .

Синтаксис для байтовых литералов в основном такой же, как и для строковых литералов, за исключением того, что добавляется префикс 'b' :

  • Одинарные кавычки: b'still allows embedded "double" quotes'
  • Двойные кавычки: b"still allows embedded 'single' quotes"
  • Тройные кавычки: b'''3 single quotes'''b"""3 double quotes"""

Как и в случае строковых литералов, байтовые литералы могут также использовать префикс 'r' для отключения обработки escape-последовательностей.

Помимо литеральных форм, объекты bytes могут быть созданы с помощью встроенного класса bytes() :

  • Заполненный нулями объект байтов указанной длины: bytes(10) .
  • Из итерируемых целых чисел: bytes(range(20)) .
  • Копирование существующих двоичных данных через буферный протокол: bytes(obj) .

В то время как байтовые литералы основаны на тексте ASCII , байтовые объекты фактически ведут себя как неизменяемые последовательности целых чисел, причем каждое значение в последовательности ограничено таким образом, что 0

Для байтовых строк доступны следующие операции:

  • общие операции c последовательностями;
  • методы доступные bytes и bytearray типам.

Две шестнадцатеричные цифры точно соответствуют одному байту, поэтому шестнадцатеричные числа являются широко используемым форматом для описания двоичных данных. Соответственно, тип bytes имеет дополнительный метод класса для чтения данных в этом формате:

bytes.fromhex(string) ::

Метод bytes.fromhex() возвращает объект bytes , декодируя данный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробелы ASCII игнорируются.

>>> bytes.fromhex('2Ef0 F1f2 ') # b'.\xf0\xf1\xf2' 
bytes.hex() ::

Метод bytes.hex() преобразовывает объект bytes в его шестнадцатеричное представление. Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта.

>>> b'\xf0\xf1\xf2'.hex() # 'f0f1f2' 

В Python-3.8 метод bytes.hex() поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричный вывод.

Если нужно облегчить чтение шестнадцатеричной строки, можно указать параметр sep разделителя из одного символа для включения в вывод. По умолчанию между каждым байтом. Второй необязательный параметр bytes_per_sep управляет интервалом. Положительные значения вычисляют положение разделителя справа, отрицательные значения слева.

>>> value = b'\xf0\xf1\xf2' >>> value.hex('-') # 'f0-f1-f2' >>> value.hex('_', 2) # 'f0_f1f2' >>> b'UUDDLRLRAB'.hex(' ', -4) #'55554444 4c524c52 4142' 

Важно: Поскольку байтовые объекты являются неизменяемыми последовательностями целых чисел (подобно кортежу), то для байтового объекта 'b' , b[0] будет целым числом, а b[0:1] - байтовым объектом длины 1. Это контрастирует с текстовыми строками, где индексация и срез будут производить строку длиной 1 символ.

Представление объектов bytes использует литеральный формат (b'. ') так как это часто более полезно и наглядно, чем, например, bytes([46, 46, 46]) . Вы всегда можете преобразовать объект bytes в список целых чисел с помощью list(b).

Примеры использования:
>>> b = bytes([46, 46, 46]) >>> b # b'. ' >>> list(b) # [46, 46, 46] >>> b = bytes(range(40,60,2)) >>> b # b'(*,.02468:' >>> list(b) [40, 42, 44, 46, 48, 50, 52, 54, 56, 58] 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Утиная типизация 'Duck Typing'
  • Что такое вызываемый объект callable?
  • Как проверить тип переменной/объекта
  • Логический тип данных bool
  • Целые числа int
  • Ограничение длины преобразования целочисленной строки
  • Вещественные числа float
  • Комплексные числа complex
  • Типы последовательностей
  • Список list
  • Кортеж tuple
  • Диапазон range
  • Текстовые строки str
  • Словарь dict
  • Множество set и frozenset
  • Итератор Iterator, протокол итератора
  • Генератор generator и выражение yield
  • Контекстный менеджер with
  • Байтовые строки bytes
  • Байтовый массив bytearray
  • Тип memoryview, буфер обмена
  • Файловый объект file object
  • Универсальный псевдоним GenericAlias
  • Объект объединения Union

как узнать сколько байтов в hex строке

Подскажите как узнать сколько байтов в строке записанной в hex, есть необходимость валидировать ethereum кошелек, длинна каждого кошелька равно 20 байтам но как это реализовать на python не пойму пробовал так:

eth = 0xf8e1f68d15e0db4e31adaed3eb0a89c1513c6dd2 print(eth.bit_length()) 156 

что совсем не то что должно быть. Спасибо.
Отслеживать
задан 18 янв 2018 в 15:05
Alexandr Vasilenko Alexandr Vasilenko
366 2 2 серебряных знака 12 12 бронзовых знаков

у вас тут мешанина типов. В заголовке вы говорите о "hex строке". В коде у вас int объект из hex literal создаётся (в Питоне str и int это совсем разные вещи). Для которого вы количество [необходимых] бит выводите. Что у вас на входе? Что вы хотите на выходе точно? К примеру: "00" что у вас должно возвращать? 0 или 1 или 2?

18 янв 2018 в 15:12
Каждые два символа [A-F][0-9] представляют один байт. Так что длину строки делите на два
18 янв 2018 в 15:27

на входе у меня строка полученная из формы на сайте, посоветуйте как мне лучше поступить ?? print(hex(eth).__len__()) выводит 41, даже если я разделю на 2 получится 20,5 а должно быть 20

18 янв 2018 в 15:28
@AlexandrVasilenko а в приведенном коде у вас НЕ строка.
18 янв 2018 в 15:29

eth = "0x0d18B2a0901FF0048Cc36F7a6C2297FBb05B68e6" print(hex(int(eth,16)).__len__()) выводит все равно 41

18 янв 2018 в 15:33

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

>> eth = 'f8e1f68d15e0db4e31adaed3eb0a89c1513c6dd2' >> s = bytearray.fromhex(eth) >> print(s) bytearray(b'\xf8\xe1\xf6\x8d\x15\xe0\xdbN1\xad\xae\xd3\xeb\n\x89\xc1Q> len(s) 20 

При этом, если в строке будут невалидные hex-значения или будет нечётное число символов, то при конвертации получите ошибку. И это автоматически будет означать, что номер кошелька невалиден.

Если же ошибки не возникло и длина оказалась равна 20, то всё валидно.

Python : Получить размер строки в байтах

У меня есть строка, которая должна быть отправлена по сети. Мне нужно проверить общий объем байтов, в котором она представлена.

sys.getsizeof(string_name) возвращает дополнительные байты. Например, для sys.getsizeof("a") возвращает 22, в то время как один символ представлен только в 1 байте в Python. Есть ли другой метод, чтобы найти это?

Поделиться Источник 06 июня 2015 в 19:23

2 ответа

Если вы хотите количество байтов в строке, эта функция должна сделать это довольно надежно.

def utf8len(s): return len(s.encode('utf-8')) 

Причина, по которой вы получили странные числа, заключается в том, что инкапсулированные в строку - это куча другой информации из-за того, что строки являются фактическими объектами в Python.

Это интересно, потому что если вы посмотрите на мое решение, чтобы закодировать строку в 'utf-8', в объекте's' есть метод 'encode' (который является строкой). Ну, его нужно хранить где-то правильно? Поэтому, большее, чем обычное количество байтов. Оно включает этот метод, а также несколько других :).

Поделиться 06 июня 2015 в 19:28

В принятом ответе есть предостережение.

Для некоторых многобайтовых кодировок (например, utf-16), string.encode добавит Byte Order Mark (BOM) в начале, что является последовательностью специальных байтов, которые информируют читателя о используемой байтовой байтовой байтовности. Таким образом, длина, которую вы получаете, на самом деле равна len(BOM) + len(encoded_word) .

Если вы не хотите подсчитывать байты BOM, вы можете использовать либо маленькую версию кодировки (добавление суффикса "le") или большую версию (добавление суффикса "be").

>>> len('ciao'.encode('utf-16')) 10 >>> len('ciao'.encode('utf-16-le')) 8 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *