<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Hidden Name</title><author><name>Hidden Name</name></author><id>https://teletype.in/atom/obrezkov</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/obrezkov?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@obrezkov?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=obrezkov"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/obrezkov?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-15T03:04:47.772Z</updated><entry><id>obrezkov:bytes-in_python</id><link rel="alternate" type="text/html" href="https://teletype.in/@obrezkov/bytes-in_python?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=obrezkov"></link><title>Объекты bytes в python</title><published>2023-04-01T18:27:03.539Z</published><updated>2023-04-01T18:27:03.539Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/22/9c/229cc6ba-e823-4082-b88e-244272db2735.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/a1/89/a1896951-b091-4907-b2ac-6d3218a8e585.png&quot;&gt;Python часто используется для различных манипуляций с данными, типичный пример работы: считать данные от пользователя, запаковать их в запрос, отправить данные на сервер. Иногда такие запакованные данные предстают не в виде текста, а в виде последовательностей нулей и единиц, с которыми, однако, программисту надо как-то работать. В таких случаях выручают объекты bytes и bytearray.</summary><content type="html">
  &lt;h2 id=&quot;992b&quot;&gt;Мотивация&lt;/h2&gt;
  &lt;p id=&quot;b169&quot;&gt;Python часто используется для различных манипуляций с данными, типичный пример работы: считать данные от пользователя, запаковать их в запрос, отправить данные на сервер. Иногда такие запакованные данные предстают не в виде текста, а в виде последовательностей нулей и единиц, с которыми, однако, программисту надо как-то работать. В таких случаях выручают объекты bytes и bytearray.&lt;/p&gt;
  &lt;h2 id=&quot;4605&quot;&gt;О байтах и битах&lt;/h2&gt;
  &lt;p id=&quot;7ccf&quot;&gt;Биты и байты считаются единицами измерения информации. Двоичный бит принимает два значения: ноль и единица. Используя бит мы можем закодировать только два состояния, но если мы используем два бита подряд, то таких состояний уже будет четыре: 00, 01, 10, 11. Мы можем даже закодировать маленький алфавит: А — 00, Б — 01, В — 10, Г — 11. Эти двоичные последовательности, также соответствуют двоичным представлениям чисел 0, 1, 2, 3.&lt;/p&gt;
  &lt;p id=&quot;1926&quot;&gt;Байт — это единица измерения информации, в типичном современном компьютере состоящая из восьми бит. Вот примеры байтов: 10010101, 00000001, 11111111, 00000000. Эти байты позволяют закодировать числа от 0 до 255. Соответственно, они позволяют закодировать даже весь алфавит. Так, к примеру, и сделано в ASCII таблице, которая использует 7 бит:&lt;/p&gt;
  &lt;figure id=&quot;cM42&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a1/89/a1896951-b091-4907-b2ac-6d3218a8e585.png&quot; width=&quot;860&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bea7&quot;&gt;Зачем такая кодировка нужна? Если говорить очень грубо, то так как по проводам мы можем передавать только условно низкий (0) и высокий (1) уровни напряжения, то и все передаваемое мы должны кодировать нулями и единицами.&lt;/p&gt;
  &lt;h2 id=&quot;4fb8&quot;&gt;Тип bytes в python&lt;/h2&gt;
  &lt;p id=&quot;33f8&quot;&gt;Для работы с последовательностями нулей и единиц, в python есть тип bytes. Он является неизменяемым, а его создание происходит следующим образом:&lt;/p&gt;
  &lt;pre id=&quot;HM5d&quot;&gt;&amp;gt;&amp;gt;&amp;gt; binary_obj = b&amp;#x27;These are some bytes&amp;#x27;
&amp;gt;&amp;gt;&amp;gt; print(binary_obj)
b&amp;#x27;This are some bytes&amp;#x27;&lt;/pre&gt;
  &lt;p id=&quot;Fs26&quot;&gt;Обратите внимание, что инициализация отличается от строкового объекта:&lt;/p&gt;
  &lt;pre id=&quot;ioRT&quot;&gt;&amp;gt;&amp;gt;&amp;gt; string_obj = &amp;#x27;These are some letters&amp;#x27;
&amp;gt;&amp;gt;&amp;gt; print(string_obj)
This are some letters&lt;/pre&gt;
  &lt;p id=&quot;ylpU&quot;&gt;Типы созданных объектов тоже будут разными:&lt;/p&gt;
  &lt;pre id=&quot;R49J&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(type(binary_obj))
&amp;lt;class &amp;#x27;bytes&amp;#x27;&amp;gt;

&amp;gt;&amp;gt;&amp;gt; print(type(string_obj))
&amp;lt;class &amp;#x27;str&amp;#x27;&amp;gt;
&lt;/pre&gt;
  &lt;p id=&quot;IiNE&quot;&gt;Байтовый объект можно получить и из строки,указав её кодировку:&lt;/p&gt;
  &lt;pre id=&quot;wsNW&quot;&gt;&amp;gt;&amp;gt;&amp;gt; bytes(string_obj, encoding=&amp;#x27;utf-8&amp;#x27;)
b&amp;#x27;This are some letters&amp;#x27;
&lt;/pre&gt;
  &lt;p id=&quot;Gg8Q&quot;&gt;Кроме этого, байтовый объект можно инициализировать нулями:&lt;/p&gt;
  &lt;pre id=&quot;j8nN&quot;&gt;&amp;gt;&amp;gt;&amp;gt; bytes(10)
b&amp;#x27;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&amp;#x27;
&lt;/pre&gt;
  &lt;p id=&quot;hMEA&quot;&gt;перечисляемым набором целых чисел:&lt;/p&gt;
  &lt;pre id=&quot;5rhL&quot;&gt;&amp;gt;&amp;gt;&amp;gt; bytes(range(16))
b&amp;#x27;\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f&amp;#x27;
&lt;/pre&gt;
  &lt;p id=&quot;IXoW&quot;&gt;или неким бинарным объектом.&lt;/p&gt;
  &lt;p id=&quot;FEFB&quot;&gt;Так как объекты byte неизменяемые, то их часто применяют при написании тестов, там, где требуются наперед заданные нетекстовые значения, к примеру, при тестировании криптографических библиотек. Часто же, больший интерес представляет изменяемый аналог byte - bytearray.&lt;/p&gt;
  &lt;h2 id=&quot;soqC&quot;&gt;Тип bytearray в python&lt;/h2&gt;
  &lt;p id=&quot;31RK&quot;&gt;Объекты bytearray являются изменяемой альтернативой объектам bytes. К примеру, если в объекте bytes мы попытаемся на место второго байта подставить байт со значением f (со значением в таблице кодировки 102), то для объекта bytes будет выдана ошибка :&lt;/p&gt;
  &lt;pre id=&quot;vkTD&quot;&gt;&amp;gt;&amp;gt;&amp;gt; a = b&amp;quot;abc&amp;quot;
&amp;gt;&amp;gt;&amp;gt; a[1] = 102

TypeError: &amp;#x27;bytes&amp;#x27; object does not support item assignment
&lt;/pre&gt;
  &lt;p id=&quot;J8no&quot;&gt;а для bytearray ошибки не будет:&lt;/p&gt;
  &lt;pre id=&quot;AgmX&quot;&gt;&amp;gt;&amp;gt;&amp;gt; b = bytearray(&amp;#x27;abc&amp;#x27;, encoding=&amp;#x27;utf-8&amp;#x27;)
&amp;gt;&amp;gt;&amp;gt; b[1] = 102
&amp;gt;&amp;gt;&amp;gt; b
bytearray(b&amp;#x27;afc&amp;#x27;)
&lt;/pre&gt;
  &lt;p id=&quot;nVI9&quot;&gt;Оба класса bytes и bytearray имеют операции обычных последовательностей, такие как: &lt;code&gt;capitalize()&lt;/code&gt;, &lt;code&gt;isdigit()&lt;/code&gt;, &lt;code&gt;split()&lt;/code&gt;, &lt;code&gt;strip()&lt;/code&gt; и т.д. Одной из отличительных особенностей этих типов является тип возвращаемых значений по срезу и по индексу. К примеру, для строки в обоих случаях возвращаемый тип будет строкой:&lt;/p&gt;
  &lt;pre id=&quot;wRYT&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(str1[4], type(str1[4]))
o &amp;lt;class &amp;#x27;str&amp;#x27;&amp;gt;

&amp;gt;&amp;gt;&amp;gt; print(str1[4:5], type(str1[4:5]))
o &amp;lt;class &amp;#x27;str&amp;#x27;&amp;gt;
&lt;/pre&gt;
  &lt;p id=&quot;VQZ0&quot;&gt;Для типа байт, обращение по индексу вернет целочисленное значение, соответствующее элементу, а срез - объект типа bytes с тем запрошенным элементом:&lt;/p&gt;
  &lt;pre id=&quot;nET9&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(byte1[4], type(byte1[4]))
111 &amp;lt;class &amp;#x27;int&amp;#x27;&amp;gt;

&amp;gt;&amp;gt;&amp;gt; print(byte1[4:5], type(byte1[4:5]))
b&amp;#x27;o&amp;#x27; &amp;lt;class &amp;#x27;bytes&amp;#x27;&amp;gt;
&lt;/pre&gt;
  &lt;h3 id=&quot;fDCo&quot;&gt;Заключение&lt;/h3&gt;
  &lt;p id=&quot;qhn0&quot;&gt;Мы рассмотрели классы &lt;code&gt;bytes&lt;/code&gt; и &lt;code&gt;bytearray&lt;/code&gt;. Эти классы позволяют работать с байтовыми представлениями данных, при этом первый является неизменяемым, а второй является изменяемым аналогом первого. Оба этих типа часто используются при тестировании программ, там где нужно подать сырые данные на вход программе, к примеру, в ручную сформированный “сломанный” пакет данных или криптографический ключ, обладающий необходимыми свойствами.&lt;/p&gt;

</content></entry></feed>