<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Hidden Name</title><generator>teletype.in</generator><description><![CDATA[Hidden Name]]></description><image><url>https://img1.teletype.in/files/0c/86/0c86ce99-47b1-4f78-b720-58735c54b421.png</url><title>Hidden Name</title><link>https://teletype.in/@obrezkov</link></image><link>https://teletype.in/@obrezkov?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=obrezkov</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/obrezkov?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/obrezkov?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 15 Jun 2026 03:05:00 GMT</pubDate><lastBuildDate>Mon, 15 Jun 2026 03:05:00 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@obrezkov/bytes-in_python</guid><link>https://teletype.in/@obrezkov/bytes-in_python?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=obrezkov</link><comments>https://teletype.in/@obrezkov/bytes-in_python?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=obrezkov#comments</comments><dc:creator>obrezkov</dc:creator><title>Объекты bytes в python</title><pubDate>Sat, 01 Apr 2023 18:27:03 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/22/9c/229cc6ba-e823-4082-b88e-244272db2735.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a1/89/a1896951-b091-4907-b2ac-6d3218a8e585.png"></img>Python часто используется для различных манипуляций с данными, типичный пример работы: считать данные от пользователя, запаковать их в запрос, отправить данные на сервер. Иногда такие запакованные данные предстают не в виде текста, а в виде последовательностей нулей и единиц, с которыми, однако, программисту надо как-то работать. В таких случаях выручают объекты bytes и bytearray.]]></description><content:encoded><![CDATA[
  <h2 id="992b">Мотивация</h2>
  <p id="b169">Python часто используется для различных манипуляций с данными, типичный пример работы: считать данные от пользователя, запаковать их в запрос, отправить данные на сервер. Иногда такие запакованные данные предстают не в виде текста, а в виде последовательностей нулей и единиц, с которыми, однако, программисту надо как-то работать. В таких случаях выручают объекты bytes и bytearray.</p>
  <h2 id="4605">О байтах и битах</h2>
  <p id="7ccf">Биты и байты считаются единицами измерения информации. Двоичный бит принимает два значения: ноль и единица. Используя бит мы можем закодировать только два состояния, но если мы используем два бита подряд, то таких состояний уже будет четыре: 00, 01, 10, 11. Мы можем даже закодировать маленький алфавит: А — 00, Б — 01, В — 10, Г — 11. Эти двоичные последовательности, также соответствуют двоичным представлениям чисел 0, 1, 2, 3.</p>
  <p id="1926">Байт — это единица измерения информации, в типичном современном компьютере состоящая из восьми бит. Вот примеры байтов: 10010101, 00000001, 11111111, 00000000. Эти байты позволяют закодировать числа от 0 до 255. Соответственно, они позволяют закодировать даже весь алфавит. Так, к примеру, и сделано в ASCII таблице, которая использует 7 бит:</p>
  <figure id="cM42" class="m_original">
    <img src="https://img3.teletype.in/files/a1/89/a1896951-b091-4907-b2ac-6d3218a8e585.png" width="860" />
  </figure>
  <p id="bea7">Зачем такая кодировка нужна? Если говорить очень грубо, то так как по проводам мы можем передавать только условно низкий (0) и высокий (1) уровни напряжения, то и все передаваемое мы должны кодировать нулями и единицами.</p>
  <h2 id="4fb8">Тип bytes в python</h2>
  <p id="33f8">Для работы с последовательностями нулей и единиц, в python есть тип bytes. Он является неизменяемым, а его создание происходит следующим образом:</p>
  <pre id="HM5d">&gt;&gt;&gt; binary_obj = b&#x27;These are some bytes&#x27;
&gt;&gt;&gt; print(binary_obj)
b&#x27;This are some bytes&#x27;</pre>
  <p id="Fs26">Обратите внимание, что инициализация отличается от строкового объекта:</p>
  <pre id="ioRT">&gt;&gt;&gt; string_obj = &#x27;These are some letters&#x27;
&gt;&gt;&gt; print(string_obj)
This are some letters</pre>
  <p id="ylpU">Типы созданных объектов тоже будут разными:</p>
  <pre id="R49J">&gt;&gt;&gt; print(type(binary_obj))
&lt;class &#x27;bytes&#x27;&gt;

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

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

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

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

]]></content:encoded></item></channel></rss>