• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed python operacje na binariach plików

Object Storage Arubacloud
+1 głos
528 wizyt
pytanie zadane 4 lutego 2020 w Python przez Pico Obywatel (1,330 p.)
zamknięte 4 lutego 2020 przez Pico

Witam, mam taki oto kod:

with open("something.zip", "rb") as f:
    txt = str(f.read())

Chciałbym w dalszej części kodu odwrócić to działanie. Ktoś wie w jaki sposób to zrobić?

komentarz zamknięcia: Adrian17 pomógł

1 odpowiedź

+2 głosów
odpowiedź 4 lutego 2020 przez adrian17 Ekspert (344,860 p.)
wybrane 4 lutego 2020 przez Pico
 
Najlepsza

Zacznijmy, od tego, że to nie zadziała. Na przykład:

>>> open("temp.data", "rb").read()
b'\xfd7zXZ\x00\x00\x04\xe6\xd6'
>>> str(open("temp.data", "rb").read())
"b'\\xfd7zXZ\\x00\\x00\\x04\\xe6\\xd6'"

Jak widać, str() nie zamienia danych binarnych na stringa, tylko pokazuje reprezentację tekstową zmiennej, nawet włącznie z "b" i apostrofami '.

"normalnym" sposobem zamiany bajtów na string jest zdekodować używając jakiegoś kodowania tekstu, ale...

>>> open("temp.data", "rb").read().decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 0: invalid start byte

Bo ta operacja po prostu nie ma logicznego sensu. Typ stringowy `str` jest dla tekstu. Bajty przeczytane z pliku .zip nie są tekstem, więc niemożliwym jest sensownie zamienić je na str. To powinno zostać w typie bajtowym, takim jaki dostajesz z .read().

Ewentualnie można zakodować bajty hexowo:

>>> open("temp.data", "rb").read().hex()
'fd377a585a000004e6d6'

Ale to już się do sprowadza do pytania, co w zasadzie chcesz zrobić i po co w ogóle to robisz.

komentarz 4 lutego 2020 przez Pico Obywatel (1,330 p.)
Ale mi właśnie o tą reprezentację textową chodzi, bo to na niej wykonuję pewne operacje, jednak potem chcę przywrócić to spowrotem do stanu początkowego i stąd moje pytanie
komentarz 4 lutego 2020 przez adrian17 Ekspert (344,860 p.)
Ale nie prościej byłoby pracować na samych bajtach tego ZIPa, a nie na reprezentacji hexowo-tekstowej?
komentarz 4 lutego 2020 przez Pico Obywatel (1,330 p.)
Otóż nie bardzo się da, przy tym co chcę robić, ponieważ podczas moich działań to już przestają być bajty, a losowe ciągi znaków, a więc ponownie. Czy da się to potem odwrócić?
komentarz 4 lutego 2020 przez adrian17 Ekspert (344,860 p.)

Można... um... evalem?

>>> a
b'\xfd7zXZ\x00\x00\x04\xe6\xd6'
>>> eval(str(a))
b'\xfd7zXZ\x00\x00\x04\xe6\xd6'

Co nie zmienia faktu, że jest to potężnie na około rozwiązanie. To tak jakby zamiast poprawić literówkę w Wordzie, chcieć spędzić czas na wydrukowanie całego dokumentu (str), poprawienie litery korektorem i zeskanowanie (eval) jego 1000 stron.

komentarz 4 lutego 2020 przez Pico Obywatel (1,330 p.)
Dzięki wielkie za pomoc, ale uwierz mi, że nie dało się tego zrobić pracując na samych bajtach. Nie mogę zdradzić o co konkretnie chodzi bo projekt wydaje mi się dość unikalny, a ja nie jestem zwolennikiem open source więc ;)
komentarz 4 lutego 2020 przez adrian17 Ekspert (344,860 p.)

a ja nie jestem zwolennikiem open source

...używając Pythona?

-_-

komentarz 4 lutego 2020 przez Pico Obywatel (1,330 p.)
W sumie trafna uwaga :D bardziej chodzi o to że cenię sobie prywatność mojego każdego projektu dopóki nie zostanie wydany, ponieważ gdyby okazał się trafny to jednak lepiej żeby nikt mi go nie podebrał

Podobne pytania

+1 głos
1 odpowiedź 118 wizyt
0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 13 listopada 2022 w Python przez niezalogowany
0 głosów
2 odpowiedzi 446 wizyt
pytanie zadane 28 lipca 2020 w Python przez Oskar Mielnik Nowicjusz (120 p.)

92,556 zapytań

141,404 odpowiedzi

319,563 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...