2009-03-10 16 views
11

Jak zakodować obraz png na base64 używając Pythona w systemie Windows?base64 png w pythonie na Windows

iconfile = open("icon.png") 
icondata = iconfile.read() 
icondata = base64.b64encode(icondata) 

Powyższe działa poprawnie w systemach Linux i OSX, ale w systemie Windows koduje kilka pierwszych znaków, a następnie je skraca. Dlaczego to?

Odpowiedz

26

Open the file in binary mode:

open("icon.png", "rb") 

nie jestem bardzo obeznany z Windows, ale ja sobie wyobrazić, co się dzieje jest to, że plik zawiera znak (0x1a), które Windows is interpreting as the end of the file (ze względów starszych), gdy jest on otwarty w trybie tekstowym. Inną kwestią jest to, że otwarcie pliku w trybie tekstowym (bez "b") w systemie Windows spowoduje przepisanie zakończeń linii, co z reguły przerwie pliki binarne, w których te znaki faktycznie nie wskazują końca wiersza.

+0

+1, ponieważ działa. – Brian

+0

jest rzeczywiście poprawny, dziwne, jak działa bez niego w systemie Linux/osx – directedition

+0

Linus/OSX traktuje pliki binarne i tekstowe tak samo, podczas gdy system Windows traktuje powrót karetki w plikach tekstowych inaczej niż w plikach binarnych. Powinieneś również kliknąć pole wyboru obok swojej odpowiedzi, aby oznaczyć ją jako poprawną odpowiedź. – Powerlord

9

nasila odpowiedź od Miles The first eight bytes in a PNG file są specjalnie przeznaczone do:

  • 89 - pierwszy bajt jest sprawdzenie, że bit 8 nie został pozbawiony
  • "PNG" - niech ktoś czytać że jest to format PNG
  • 0d 0A - The end-of-line wskaźnik DOS, aby sprawdzić, czy nie było DOS> UNIX konwersja
  • 1a - w EOF char DOS Acter, aby sprawdzić, czy plik został otwarty w trybie binarnym
  • 0a - UNIX end-of-line znaków, aby sprawdzenia, czy nie było unix-> DOS konwersja

Kod zatrzymuje się 1a, zgodnie z projektem.