{"id":1424,"date":"2026-04-04T13:37:58","date_gmt":"2026-04-04T11:37:58","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1424"},"modified":"2026-04-21T13:41:46","modified_gmt":"2026-04-21T11:41:46","slug":"bytes-tworzy-niemutowalna-sekwencje-bajtow","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/04\/bytes-tworzy-niemutowalna-sekwencje-bajtow\/","title":{"rendered":"Bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Dane tekstowe i dane binarne wygl\u0105daj\u0105 podobnie tylko na pierwszy rzut oka. W praktyce programista bardzo szybko zauwa\u017ca r\u00f3\u017cnic\u0119 mi\u0119dzy napisem przeznaczonym do wy\u015bwietlenia u\u017cytkownikowi a surowym ci\u0105giem bajt\u00f3w pochodz\u0105cym z pliku, gniazda sieciowego albo pami\u0119ci urz\u0105dzenia. To rozr\u00f3\u017cnienie ma znaczenie przy kodowaniu znak\u00f3w, pracy z protoko\u0142ami sieciowymi, szyfrowaniu, serializacji i analizie plik\u00f3w binarnych. W Pythonie jednym z podstawowych narz\u0119dzi do takiej pracy jest <strong>bytes<\/strong> \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#dlaczego-bytes-tworzy-niemutowalna-sekwencje-bajtow-i-czym-rozni-sie-od-zwyklego-tekstu\">Dlaczego bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w i czym r\u00f3\u017cni si\u0119 od zwyk\u0142ego tekstu<\/a><ol><li><a href=\"#roznica-miedzy-str-bytes-i-bytearray\">R\u00f3\u017cnica mi\u0119dzy str, bytes i bytearray<\/a><\/li><li><a href=\"#podstawowe-tworzenie-obiektu\">Podstawowe tworzenie obiektu<\/a><\/li><\/ol><\/li><li><a href=\"#jak-bytes-tworzy-niemutowalna-sekwencje-bajtow-w-pamieci-i-wplywa-na-bezpieczenstwo-operacji\">Jak bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w w pami\u0119ci i wp\u0142ywa na bezpiecze\u0144stwo operacji<\/a><ol><li><a href=\"#proba-modyfikacji-zakonczy-sie-bledem\">Pr\u00f3ba modyfikacji zako\u0144czy si\u0119 b\u0142\u0119dem<\/a><\/li><li><a href=\"#kodowanie-i-dekodowanie\">Kodowanie i dekodowanie<\/a><\/li><li><a href=\"#wzor-myslowy-przy-pracy-z-danymi\">Wz\u00f3r my\u015blowy przy pracy z danymi<\/a><\/li><\/ol><\/li><li><a href=\"#praktyczne-uzycie-bytes-tworzy-niemutowalna-sekwencje-bajtow-podczas-pracy-z-plikami-i-siecia\">Praktyczne u\u017cycie bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w podczas pracy z plikami i sieci\u0105<\/a><ol><li><a href=\"#odczyt-pliku-binarnego-w-pythonie\">Odczyt pliku binarnego w Pythonie<\/a><\/li><li><a href=\"#wysylanie-danych-przez-socket\">Wysy\u0142anie danych przez socket<\/a><\/li><li><a href=\"#odpowiedniki-w-innych-jezykach\">Odpowiedniki w innych j\u0119zykach<\/a><\/li><\/ol><\/li><li><a href=\"#operacje-czesto-uzywane-podczas-analizy-danych-binarnych-i-protokolow\">Operacje cz\u0119sto u\u017cywane podczas analizy danych binarnych i protoko\u0142\u00f3w<\/a><ol><li><a href=\"#typowe-operacje\">Typowe operacje<\/a><\/li><li><a href=\"#przyklad-analizy-prostego-naglowka\">Przyk\u0142ad analizy prostego nag\u0142\u00f3wka<\/a><\/li><\/ol><\/li><li><a href=\"#pulapki-praktyczne-i-bledy-ktore-kosztuja-najwiecej-czasu\">Pu\u0142apki praktyczne i b\u0142\u0119dy, kt\u00f3re kosztuj\u0105 najwi\u0119cej czasu<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-bytes-i-str-zajmuja-tyle-samo-pamieci\">Czy bytes i str zajmuj\u0105 tyle samo pami\u0119ci<\/a><\/li><li><a href=\"#kiedy-uzywac-bytearray-zamiast-bytes\">Kiedy u\u017cywa\u0107 bytearray zamiast bytes<\/a><\/li><li><a href=\"#czy-b-abc-i-abc-to-to-samo\">Czy b&#8221;ABC&#8221; i &#8222;ABC&#8221; to to samo<\/a><\/li><li><a href=\"#dlaczego-indeks-bytes-zwraca-liczbe\">Dlaczego indeks bytes zwraca liczb\u0119<\/a><\/li><li><a href=\"#czy-mozna-bezpiecznie-haszowac-zwykly-tekst\">Czy mo\u017cna bezpiecznie haszowa\u0107 zwyk\u0142y tekst<\/a><\/li><\/ol><\/li><li><a href=\"#zakonczenie\">Zako\u0144czenie<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dlaczego-bytes-tworzy-niemutowalna-sekwencje-bajtow-i-czym-rozni-sie-od-zwyklego-tekstu\">Dlaczego bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w i czym r\u00f3\u017cni si\u0119 od zwyk\u0142ego tekstu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Typ <code>str<\/code> w Pythonie reprezentuje tekst, czyli znaki Unicode. Typ <code>bytes<\/code> reprezentuje surowe dane binarne, czyli warto\u015bci od <code>0<\/code> do <code>255<\/code>. To nie jest kosmetyczna r\u00f3\u017cnica. Dla interpretera i dla systemu operacyjnego s\u0105 to dwa r\u00f3\u017cne \u015bwiaty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad praktyczny: napis <code>\"ABC\"<\/code> to informacja tekstowa. Natomiast <code>b\"ABC\"<\/code> to trzy konkretne bajty o warto\u015bciach dziesi\u0119tnych <code>65<\/code>, <code>66<\/code>, <code>67<\/code>. Je\u015bli odczytujemy plik JPG, pakiet TCP albo fragment pami\u0119ci urz\u0105dzenia, pracujemy w\u0142a\u015bnie na bajtach, nie na tek\u015bcie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Niemutowalno\u015b\u0107 oznacza, \u017ce po utworzeniu obiektu nie mo\u017cna zmieni\u0107 pojedynczego elementu bez stworzenia nowego obiektu. To zachowanie jest podobne do <code>str<\/code> i r\u00f3\u017cni si\u0119 od <code>list<\/code> czy <code>bytearray<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"roznica-miedzy-str-bytes-i-bytearray\">R\u00f3\u017cnica mi\u0119dzy str, bytes i bytearray<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Typ<\/th><th>Zawarto\u015b\u0107<\/th><th>Mutowalno\u015b\u0107<\/th><th>Typowe zastosowanie<\/th><\/tr><\/thead><tbody><tr><td><code>str<\/code><\/td><td>tekst Unicode<\/td><td>nie<\/td><td>komunikaty, dane u\u017cytkownika, JSON<\/td><\/tr><tr><td><code>bytes<\/code><\/td><td>surowe bajty <code>0\u2013255<\/code><\/td><td>nie<\/td><td>pliki binarne, sie\u0107, kryptografia<\/td><\/tr><tr><td><code>bytearray<\/code><\/td><td>surowe bajty <code>0\u2013255<\/code><\/td><td>tak<\/td><td>modyfikacja bufor\u00f3w danych<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"podstawowe-tworzenie-obiektu\">Podstawowe tworzenie obiektu<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>litera\u0142 bajtowy<\/td><td><code>dane = b\"ABC\"<\/code><\/td><\/tr><tr><td>z listy liczb<\/td><td><code>dane = bytes([65, 66, 67])<\/code><\/td><\/tr><tr><td>z tekstu przez kodowanie<\/td><td><code>dane = \"Za\u017c\u00f3\u0142\u0107\".encode(\"utf-8\")<\/code><\/td><\/tr><tr><td>pusty obiekt<\/td><td><code>dane = bytes()<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cdy element <code>bytes<\/code> jest liczb\u0105 ca\u0142kowit\u0105, nie pojedynczym znakiem.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Kod<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td>odczyt indeksu<\/td><td><code>b\"ABC\"[0]<\/code><\/td><td><code>65<\/code><\/td><\/tr><tr><td>d\u0142ugo\u015b\u0107<\/td><td><code>len(b\"ABC\")<\/code><\/td><td><code>3<\/code><\/td><\/tr><tr><td>wycinek<\/td><td><code>b\"ABCDE\"[1:4]<\/code><\/td><td><code>b'BCD'<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To cz\u0119sto zaskakuje osoby przyzwyczajone do <code>str<\/code>, gdzie indeks zwraca znak.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"jak-bytes-tworzy-niemutowalna-sekwencje-bajtow-w-pamieci-i-wplywa-na-bezpieczenstwo-operacji\">Jak bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w w pami\u0119ci i wp\u0142ywa na bezpiecze\u0144stwo operacji<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Niemutowalno\u015b\u0107 nie jest tylko decyzj\u0105 sk\u0142adniow\u0105. Ma realne skutki wydajno\u015bciowe i bezpiecze\u0144stwa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi kilka fragment\u00f3w programu korzysta z tego samego obiektu <code>bytes<\/code>, interpreter nie musi pilnowa\u0107 ryzyka przypadkowej modyfikacji danych. To upraszcza prac\u0119 z cache, haszowaniem i przekazywaniem danych mi\u0119dzy funkcjami.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W systemach sieciowych i przy parsowaniu protoko\u0142\u00f3w ma to znaczenie praktyczne. Je\u015bli ramka danych zosta\u0142a odebrana i przekazana dalej, brak mo\u017cliwo\u015bci jej przypadkowej zmiany zmniejsza liczb\u0119 trudnych b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"proba-modyfikacji-zakonczy-sie-bledem\">Pr\u00f3ba modyfikacji zako\u0144czy si\u0119 b\u0142\u0119dem<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>niepoprawna modyfikacja<\/td><td><code>dane = b\"ABC\"<\/code><\/td><\/tr><tr><td><\/td><td><code>dane[0] = 90<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Komunikat<\/th><\/tr><\/thead><tbody><tr><td><code>TypeError: 'bytes' object does not support item assignment<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli potrzebna jest zmiana zawarto\u015bci, u\u017cywa si\u0119 <code>bytearray<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>mutowalny bufor<\/td><td><code>bufor = bytearray(b\"ABC\")<\/code><\/td><\/tr><tr><td>zmiana pierwszego bajtu<\/td><td><code>bufor[0] = 90<\/code><\/td><\/tr><tr><td>wynik<\/td><td><code>bytearray(b'ZBC')<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kodowanie-i-dekodowanie\">Kodowanie i dekodowanie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy b\u0142\u0105d pocz\u0105tkuj\u0105cych: mieszanie <code>str<\/code> i <code>bytes<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Program nie mo\u017ce automatycznie zgadn\u0105\u0107, czy dane maj\u0105 by\u0107 traktowane jako UTF-8, UTF-16, ASCII czy ISO-8859-2. Trzeba wskaza\u0107 kodowanie jawnie.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>tekst \u2192 bajty<\/td><td><code>\"plik.txt\".encode(\"utf-8\")<\/code><\/td><\/tr><tr><td>bajty \u2192 tekst<\/td><td><code>b\"plik.txt\".decode(\"utf-8\")<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">UTF-8 jest dzi\u015b najcz\u0119\u015bciej u\u017cywanym kodowaniem, ale w starszych systemach i integracjach nadal pojawiaj\u0105 si\u0119 inne standardy. B\u0142\u0105d kodowania mo\u017ce oznacza\u0107 nie tylko z\u0142e znaki na ekranie, ale te\u017c uszkodzenie danych w bazie albo b\u0142\u0119dny podpis kryptograficzny.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wzor-myslowy-przy-pracy-z-danymi\">Wz\u00f3r my\u015blowy przy pracy z danymi<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Sytuacja<\/th><th>Pytanie kontrolne<\/th><\/tr><\/thead><tbody><tr><td>dane od u\u017cytkownika<\/td><td>czy to tekst?<\/td><\/tr><tr><td>dane z gniazda TCP<\/td><td>czy to ju\u017c bajty?<\/td><\/tr><tr><td>zapis do pliku PDF<\/td><td>czy potrzebny jest format binarny?<\/td><\/tr><tr><td>podpis SHA-256<\/td><td>czy haszuj\u0119 bytes, a nie str?<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To prosty nawyk, ale oszcz\u0119dza du\u017co czasu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"praktyczne-uzycie-bytes-tworzy-niemutowalna-sekwencje-bajtow-podczas-pracy-z-plikami-i-siecia\">Praktyczne u\u017cycie bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w podczas pracy z plikami i sieci\u0105<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najbardziej naturalne u\u017cycie pojawia si\u0119 przy plikach binarnych i transmisji sieciowej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Plik tekstowy mo\u017cna czyta\u0107 w trybie <code>\"r\"<\/code>, ale obraz PNG, archiwum ZIP albo plik MP3 powinny by\u0107 otwierane w trybie binarnym <code>\"rb\"<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"odczyt-pliku-binarnego-w-pythonie\">Odczyt pliku binarnego w Pythonie<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>odczyt nag\u0142\u00f3wka pliku<\/td><td><code>with open(\"obraz.png\", \"rb\") as f:<\/code><\/td><\/tr><tr><td><\/td><td><code>naglowek = f.read(8)<\/code><\/td><\/tr><tr><td><\/td><td><code>print(naglowek)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">PNG ma charakterystyczny nag\u0142\u00f3wek binarny zaczynaj\u0105cy si\u0119 od okre\u015blonych bajt\u00f3w. Program nie analizuje tutaj tekstu, tylko konkretne warto\u015bci binarne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wysylanie-danych-przez-socket\">Wysy\u0142anie danych przez socket<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>wys\u0142anie komunikatu HTTP<\/td><td><code>sock.send(b\"GET \/ HTTP\/1.1\\r\\n\\r\\n\")<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Socket oczekuje bajt\u00f3w. Pr\u00f3ba wys\u0142ania zwyk\u0142ego <code>str<\/code> bez konwersji cz\u0119sto ko\u0144czy si\u0119 b\u0142\u0119dem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"odpowiedniki-w-innych-jezykach\">Odpowiedniki w innych j\u0119zykach<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>unsigned char data[] = {65, 66, 67};<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>std::vector&lt;unsigned char&gt; data = {65, 66, 67};<\/code><\/td><\/tr><tr><td>PHP<\/td><td><code>$data = pack(\"C*\", 65, 66, 67);<\/code><\/td><\/tr><tr><td>Python<\/td><td><code>data = bytes([65, 66, 67])<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Idea jest ta sama: przechowujemy warto\u015bci bajtowe, nie znaki tekstowe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"operacje-czesto-uzywane-podczas-analizy-danych-binarnych-i-protokolow\">Operacje cz\u0119sto u\u017cywane podczas analizy danych binarnych i protoko\u0142\u00f3w<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Praca z bajtami bardzo cz\u0119sto oznacza parsowanie struktury danych: nag\u0142\u00f3wka pliku, pakietu sieciowego, odpowiedzi urz\u0105dzenia albo danych z API niskiego poziomu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsze operacje to indeksowanie, ci\u0119cie fragment\u00f3w i por\u00f3wnywanie sygnatur.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"typowe-operacje\">Typowe operacje<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Kod<\/th><th>Zastosowanie<\/th><\/tr><\/thead><tbody><tr><td>sprawdzenie prefiksu<\/td><td><code>dane.startswith(b\"PK\")<\/code><\/td><td>wykrywanie ZIP<\/td><\/tr><tr><td>wyszukiwanie<\/td><td><code>dane.find(b\"\\r\\n\")<\/code><\/td><td>koniec nag\u0142\u00f3wka<\/td><\/tr><tr><td>podzia\u0142<\/td><td><code>dane.split(b\",\")<\/code><\/td><td>prosty format binarny<\/td><\/tr><tr><td>por\u00f3wnanie<\/td><td><code>dane == wzorzec<\/code><\/td><td>walidacja<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-analizy-prostego-naglowka\">Przyk\u0142ad analizy prostego nag\u0142\u00f3wka<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>pakiet = b\"ID01DATA\"<\/code><\/td><\/tr><tr><td><code>identyfikator = pakiet[:4]<\/code><\/td><\/tr><tr><td><code>zawartosc = pakiet[4:]<\/code><\/td><\/tr><tr><td><code>print(identyfikator)<\/code><\/td><\/tr><tr><td><code>print(zawartosc)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tak wygl\u0105da podstawowe rozdzielanie danych binarnych bez dodatkowych bibliotek.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pulapki-praktyczne-i-bledy-ktore-kosztuja-najwiecej-czasu\">Pu\u0142apki praktyczne i b\u0142\u0119dy, kt\u00f3re kosztuj\u0105 najwi\u0119cej czasu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy problem nie wynika z trudnej teorii, tylko z drobnego niedopatrzenia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pierwszy b\u0142\u0105d to mieszanie <code>str<\/code> i <code>bytes<\/code> w konkatenacji.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>B\u0142\u0119dny kod<\/th><\/tr><\/thead><tbody><tr><td><code>b\"ID:\" + \"123\"<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To zako\u0144czy si\u0119 b\u0142\u0119dem typu. Trzeba u\u017cy\u0107 jednej reprezentacji.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Poprawny kod<\/th><\/tr><\/thead><tbody><tr><td><code>b\"ID:\" + b\"123\"<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">albo<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Poprawny kod<\/th><\/tr><\/thead><tbody><tr><td><code>\"ID:\" + \"123\"<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi b\u0142\u0105d to niejawne za\u0142o\u017cenie kodowania. Je\u015bli system A zapisuje dane w <code>cp1250<\/code>, a system B odczytuje je jako UTF-8, problem mo\u017ce by\u0107 trudny do wykrycia przez wiele dni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeci b\u0142\u0105d to u\u017cywanie <code>bytes<\/code> tam, gdzie potrzebny jest tekst. Logi, komunikaty u\u017cytkownika i dane JSON zwykle powinny ko\u0144czy\u0107 jako <code>str<\/code>, nawet je\u015bli wcze\u015bniej przysz\u0142y jako bajty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Czwarty b\u0142\u0105d to kopiowanie du\u017cych obiekt\u00f3w bez potrzeby. Przy du\u017cych plikach binarnych ka\u017cda zb\u0119dna kopia oznacza realny koszt pami\u0119ci i czasu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-bytes-i-str-zajmuja-tyle-samo-pamieci\">Czy bytes i str zajmuj\u0105 tyle samo pami\u0119ci<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie zawsze. <code>str<\/code> przechowuje znaki Unicode i mo\u017ce wymaga\u0107 innej reprezentacji wewn\u0119trznej ni\u017c prosty ci\u0105g bajt\u00f3w. <code>bytes<\/code> przechowuje warto\u015bci 0\u2013255, wi\u0119c przy danych binarnych bywa prostszy i bardziej przewidywalny.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-uzywac-bytearray-zamiast-bytes\">Kiedy u\u017cywa\u0107 bytearray zamiast bytes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gdy dane maj\u0105 by\u0107 modyfikowane wielokrotnie: budowa pakietu, edycja bufora, zmiana fragment\u00f3w pliku w pami\u0119ci. Je\u015bli dane s\u0105 tylko odczytywane i przekazywane dalej, <code>bytes<\/code> zwykle jest lepszym wyborem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-b-abc-i-abc-to-to-samo\">Czy b&#8221;ABC&#8221; i &#8222;ABC&#8221; to to samo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Pierwszy zapis oznacza bajty, drugi tekst Unicode. Wizualnie wygl\u0105daj\u0105 podobnie, ale semantycznie s\u0105 r\u00f3\u017cne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-indeks-bytes-zwraca-liczbe\">Dlaczego indeks bytes zwraca liczb\u0119<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Poniewa\u017c pojedynczy element to bajt, czyli warto\u015b\u0107 liczbowa od 0 do 255. To celowe zachowanie u\u0142atwiaj\u0105ce analiz\u0119 binarn\u0105.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-bezpiecznie-haszowac-zwykly-tekst\">Czy mo\u017cna bezpiecznie haszowa\u0107 zwyk\u0142y tekst<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najpierw trzeba go zakodowa\u0107, najcz\u0119\u015bciej przez UTF-8. Funkcje kryptograficzne pracuj\u0105 na bajtach, nie na <code>str<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zakonczenie\">Zako\u0144czenie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zrozumienie r\u00f3\u017cnicy mi\u0119dzy tekstem a danymi binarnymi jest jedn\u0105 z tych rzeczy, kt\u00f3re na pocz\u0105tku wydaj\u0105 si\u0119 drobne, a p\u00f3\u017aniej decyduj\u0105 o stabilno\u015bci ca\u0142ego programu. Przy pracy z plikami, sieci\u0105, kryptografi\u0105 i integracjami z innymi systemami b\u0142\u0119dne za\u0142o\u017cenie dotycz\u0105ce bajt\u00f3w potrafi zepsu\u0107 wszystko od cichej utraty polskich znak\u00f3w a\u017c po uszkodzenie podpisu cyfrowego. Typ <code>bytes<\/code> nie jest dodatkiem do j\u0119zyka, tylko podstawowym narz\u0119dziem pracy z realnymi danymi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dane tekstowe i dane binarne wygl\u0105daj\u0105 podobnie tylko na pierwszy rzut oka. W praktyce programista bardzo szybko zauwa\u017ca r\u00f3\u017cnic\u0119 mi\u0119dzy napisem przeznaczonym do wy\u015bwietlenia u\u017cytkownikowi a surowym ci\u0105giem bajt\u00f3w pochodz\u0105cym z pliku, gniazda sieciowego albo pami\u0119ci urz\u0105dzenia. To rozr\u00f3\u017cnienie ma znaczenie przy kodowaniu znak\u00f3w, pracy z protoko\u0142ami sieciowymi, szyfrowaniu, serializacji i analizie plik\u00f3w binarnych. W Pythonie jednym z podstawowych narz\u0119dzi do takiej pracy jest bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w. Dlaczego bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w i czym r\u00f3\u017cni si\u0119 od zwyk\u0142ego tekstu Typ str w Pythonie reprezentuje tekst, czyli znaki Unicode. Typ bytes reprezentuje surowe dane binarne, czyli warto\u015bci od 0 do 255. To nie jest kosmetyczna r\u00f3\u017cnica. Dla interpretera i dla systemu operacyjnego s\u0105 to dwa r\u00f3\u017cne \u015bwiaty. Przyk\u0142ad praktyczny: napis &#8222;ABC&#8221; to informacja tekstowa. Natomiast b&#8221;ABC&#8221; to trzy konkretne bajty o warto\u015bciach dziesi\u0119tnych 65, 66, 67. Je\u015bli odczytujemy plik JPG, pakiet TCP albo fragment pami\u0119ci urz\u0105dzenia, pracujemy w\u0142a\u015bnie na bajtach, nie na tek\u015bcie. Niemutowalno\u015b\u0107 oznacza, \u017ce po utworzeniu obiektu nie mo\u017cna zmieni\u0107 pojedynczego elementu bez stworzenia nowego obiektu. To zachowanie jest podobne do str i r\u00f3\u017cni si\u0119 od list czy bytearray. R\u00f3\u017cnica mi\u0119dzy str, bytes i bytearray Typ Zawarto\u015b\u0107 Mutowalno\u015b\u0107 Typowe zastosowanie str tekst Unicode nie komunikaty, dane u\u017cytkownika, JSON bytes surowe bajty 0\u2013255 nie pliki binarne, sie\u0107, kryptografia bytearray surowe bajty 0\u2013255 tak modyfikacja bufor\u00f3w danych Podstawowe tworzenie obiektu Przyk\u0142ad Kod litera\u0142 bajtowy dane = b&#8221;ABC&#8221; z listy liczb dane = bytes([65, 66, 67]) z tekstu przez kodowanie dane = &#8222;Za\u017c\u00f3\u0142\u0107&#8221;.encode(&#8222;utf-8&#8243;) pusty obiekt dane = bytes() Ka\u017cdy element bytes jest liczb\u0105 ca\u0142kowit\u0105, nie pojedynczym znakiem. Operacja Kod Wynik odczyt indeksu b&#8221;ABC&#8221;[0] 65 d\u0142ugo\u015b\u0107 len(b&#8221;ABC&#8221;) 3 wycinek b&#8221;ABCDE&#8221;[1:4] b&#8217;BCD&#8217; To cz\u0119sto zaskakuje osoby przyzwyczajone do str, gdzie indeks zwraca znak. Jak bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w w pami\u0119ci i wp\u0142ywa na bezpiecze\u0144stwo operacji Niemutowalno\u015b\u0107 nie jest tylko decyzj\u0105 sk\u0142adniow\u0105. Ma realne skutki wydajno\u015bciowe i bezpiecze\u0144stwa. Je\u017celi kilka fragment\u00f3w programu korzysta z tego samego obiektu bytes, interpreter nie musi pilnowa\u0107 ryzyka przypadkowej modyfikacji danych. To upraszcza prac\u0119 z cache, haszowaniem i przekazywaniem danych mi\u0119dzy funkcjami. W systemach sieciowych i przy parsowaniu protoko\u0142\u00f3w ma to znaczenie praktyczne. Je\u015bli ramka danych zosta\u0142a odebrana i przekazana dalej, brak mo\u017cliwo\u015bci jej przypadkowej zmiany zmniejsza liczb\u0119 trudnych b\u0142\u0119d\u00f3w. Pr\u00f3ba modyfikacji zako\u0144czy si\u0119 b\u0142\u0119dem Przyk\u0142ad Kod niepoprawna modyfikacja dane = b&#8221;ABC&#8221; dane[0] = 90 Wynik: Komunikat TypeError: 'bytes&#8217; object does not support item assignment Je\u015bli potrzebna jest zmiana zawarto\u015bci, u\u017cywa si\u0119 bytearray. Przyk\u0142ad Kod mutowalny bufor bufor = bytearray(b&#8221;ABC&#8221;) zmiana pierwszego bajtu bufor[0] = 90 wynik bytearray(b&#8217;ZBC&#8217;) Kodowanie i dekodowanie Najcz\u0119stszy b\u0142\u0105d pocz\u0105tkuj\u0105cych: mieszanie str i bytes. Program nie mo\u017ce automatycznie zgadn\u0105\u0107, czy dane maj\u0105 by\u0107 traktowane jako UTF-8, UTF-16, ASCII czy ISO-8859-2. Trzeba wskaza\u0107 kodowanie jawnie. Operacja Kod tekst \u2192 bajty &#8222;plik.txt&#8221;.encode(&#8222;utf-8&#8243;) bajty \u2192 tekst b&#8221;plik.txt&#8221;.decode(&#8222;utf-8&#8221;) UTF-8 jest dzi\u015b najcz\u0119\u015bciej u\u017cywanym kodowaniem, ale w starszych systemach i integracjach nadal pojawiaj\u0105 si\u0119 inne standardy. B\u0142\u0105d kodowania mo\u017ce oznacza\u0107 nie tylko z\u0142e znaki na ekranie, ale te\u017c uszkodzenie danych w bazie albo b\u0142\u0119dny podpis kryptograficzny. Wz\u00f3r my\u015blowy przy pracy z danymi Sytuacja Pytanie kontrolne dane od u\u017cytkownika czy to tekst? dane z gniazda TCP czy to ju\u017c bajty? zapis do pliku PDF czy potrzebny jest format binarny? podpis SHA-256 czy haszuj\u0119 bytes, a nie str? To prosty nawyk, ale oszcz\u0119dza du\u017co czasu. Praktyczne u\u017cycie bytes \u2013 tworzy niemutowaln\u0105 sekwencj\u0119 bajt\u00f3w podczas pracy z plikami i sieci\u0105 Najbardziej naturalne u\u017cycie pojawia si\u0119 przy plikach binarnych i transmisji sieciowej. Plik tekstowy mo\u017cna czyta\u0107 w trybie &#8222;r&#8221;, ale obraz PNG, archiwum ZIP albo plik MP3 powinny by\u0107 otwierane w trybie binarnym &#8222;rb&#8221;. Odczyt pliku binarnego w Pythonie Przyk\u0142ad Kod odczyt nag\u0142\u00f3wka pliku with open(&#8222;obraz.png&#8221;, &#8222;rb&#8221;) as f: naglowek = f.read(8) print(naglowek) PNG ma charakterystyczny nag\u0142\u00f3wek binarny zaczynaj\u0105cy si\u0119 od okre\u015blonych bajt\u00f3w. Program nie analizuje tutaj tekstu, tylko konkretne warto\u015bci binarne. Wysy\u0142anie danych przez socket Przyk\u0142ad Kod wys\u0142anie komunikatu HTTP sock.send(b&#8221;GET \/ HTTP\/1.1\\r\\n\\r\\n&#8221;) Socket oczekuje bajt\u00f3w. Pr\u00f3ba wys\u0142ania zwyk\u0142ego str bez konwersji cz\u0119sto ko\u0144czy si\u0119 b\u0142\u0119dem. Odpowiedniki w innych j\u0119zykach J\u0119zyk Kod C unsigned char data[] = {65, 66, 67}; C++ std::vector&lt;unsigned char&gt; data = {65, 66, 67}; PHP $data = pack(&#8222;C*&#8221;, 65, 66, 67); Python data = bytes([65, 66, 67]) Idea jest ta sama: przechowujemy warto\u015bci bajtowe, nie znaki tekstowe. Operacje cz\u0119sto u\u017cywane podczas analizy danych binarnych i protoko\u0142\u00f3w Praca z bajtami bardzo cz\u0119sto oznacza parsowanie struktury danych: nag\u0142\u00f3wka pliku, pakietu sieciowego, odpowiedzi urz\u0105dzenia albo danych z API niskiego poziomu. Najwa\u017cniejsze operacje to indeksowanie, ci\u0119cie fragment\u00f3w i por\u00f3wnywanie sygnatur. Typowe operacje Operacja Kod Zastosowanie sprawdzenie prefiksu dane.startswith(b&#8221;PK&#8221;) wykrywanie ZIP wyszukiwanie dane.find(b&#8221;\\r\\n&#8221;) koniec nag\u0142\u00f3wka podzia\u0142 dane.split(b&#8221;,&#8221;) prosty format binarny por\u00f3wnanie dane == wzorzec walidacja Przyk\u0142ad analizy prostego nag\u0142\u00f3wka Kod pakiet = b&#8221;ID01DATA&#8221; identyfikator = pakiet[:4] zawartosc = pakiet[4:] print(identyfikator) print(zawartosc) Tak wygl\u0105da podstawowe rozdzielanie danych binarnych bez dodatkowych bibliotek. Pu\u0142apki praktyczne i b\u0142\u0119dy, kt\u00f3re kosztuj\u0105 najwi\u0119cej czasu Najcz\u0119stszy problem nie wynika z trudnej teorii, tylko z drobnego niedopatrzenia. Pierwszy b\u0142\u0105d to mieszanie str i bytes w konkatenacji. B\u0142\u0119dny kod b&#8221;ID:&#8221; + &#8222;123&#8221; To zako\u0144czy si\u0119 b\u0142\u0119dem typu. Trzeba u\u017cy\u0107 jednej reprezentacji. Poprawny kod b&#8221;ID:&#8221; + b&#8221;123&#8243; albo Poprawny kod &#8222;ID:&#8221; + &#8222;123&#8221; Drugi b\u0142\u0105d to niejawne za\u0142o\u017cenie kodowania. Je\u015bli system A zapisuje dane w cp1250, a system B odczytuje je jako UTF-8, problem mo\u017ce by\u0107 trudny do wykrycia przez wiele dni. Trzeci b\u0142\u0105d to u\u017cywanie bytes tam, gdzie potrzebny jest tekst. Logi, komunikaty u\u017cytkownika i dane JSON zwykle powinny ko\u0144czy\u0107 jako str, nawet je\u015bli wcze\u015bniej przysz\u0142y jako bajty. Czwarty b\u0142\u0105d to kopiowanie du\u017cych obiekt\u00f3w bez potrzeby. Przy du\u017cych plikach binarnych ka\u017cda zb\u0119dna kopia oznacza realny koszt pami\u0119ci i czasu. FAQ Czy bytes i str zajmuj\u0105 tyle samo pami\u0119ci Nie zawsze. str przechowuje znaki Unicode i mo\u017ce wymaga\u0107 innej reprezentacji wewn\u0119trznej ni\u017c prosty ci\u0105g bajt\u00f3w. bytes przechowuje warto\u015bci 0\u2013255, wi\u0119c przy danych binarnych bywa prostszy i bardziej przewidywalny. Kiedy u\u017cywa\u0107 bytearray zamiast bytes Gdy dane maj\u0105 by\u0107 modyfikowane wielokrotnie: budowa pakietu, edycja bufora, zmiana fragment\u00f3w pliku w pami\u0119ci. Je\u015bli dane s\u0105 tylko odczytywane i przekazywane dalej, bytes zwykle jest lepszym wyborem. Czy b&#8221;ABC&#8221; i &#8222;ABC&#8221; to to samo Nie. Pierwszy zapis oznacza bajty, drugi tekst Unicode. Wizualnie wygl\u0105daj\u0105 podobnie, ale semantycznie s\u0105 r\u00f3\u017cne. Dlaczego indeks bytes zwraca liczb\u0119 Poniewa\u017c pojedynczy element to bajt, czyli warto\u015b\u0107 liczbowa od 0 do 255. To celowe zachowanie u\u0142atwiaj\u0105ce analiz\u0119 binarn\u0105. Czy mo\u017cna bezpiecznie haszowa\u0107 zwyk\u0142y tekst Najpierw trzeba go zakodowa\u0107, najcz\u0119\u015bciej przez UTF-8. Funkcje kryptograficzne pracuj\u0105 na bajtach, nie na str. Zako\u0144czenie Zrozumienie r\u00f3\u017cnicy mi\u0119dzy tekstem a danymi binarnymi jest jedn\u0105 z tych rzeczy, kt\u00f3re na pocz\u0105tku wydaj\u0105 si\u0119 drobne, a p\u00f3\u017aniej decyduj\u0105 o stabilno\u015bci ca\u0142ego programu. Przy pracy z plikami, sieci\u0105, kryptografi\u0105 i integracjami z innymi systemami b\u0142\u0119dne za\u0142o\u017cenie dotycz\u0105ce bajt\u00f3w potrafi zepsu\u0107 wszystko od cichej utraty polskich znak\u00f3w a\u017c po uszkodzenie podpisu cyfrowego. Typ bytes nie jest dodatkiem do j\u0119zyka, tylko podstawowym narz\u0119dziem pracy z realnymi danymi. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1425,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-1424","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kodowanie"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1424","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1424"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1424\/revisions"}],"predecessor-version":[{"id":1426,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1424\/revisions\/1426"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1425"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1424"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1424"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1424"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}