2009-03-10 17 views
11

¿Cómo se codifica una imagen png en base64 utilizando python en Windows?png base64 en python en Windows

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

Lo anterior funciona bien en Linux y OSX, pero en Windows codificará los primeros caracteres y luego se acortará. ¿Por qué es esto?

Respuesta

26

Open the file in binary mode:

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

No estoy muy familiarizado con Windows, pero me imagino lo que está sucediendo es que el archivo contiene un carácter (0x1A) que Windows is interpreting as the end of the file (por razones de compatibilidad) cuando se abre en modo texto. El otro problema es que abrir un archivo en modo texto (sin la 'b') en Windows hará que se reescriban los finales de línea, lo que generalmente romperá los archivos binarios donde esos caracteres realmente no indican el final de una línea.

+0

+1 porque funciona. – Brian

+0

es realmente correcto, extraño cómo funciona bien sin él en linux/osx – directedition

+0

Linus/OSX trata los archivos binarios y de texto de la misma manera, mientras que Windows trata el retorno de carro diferente en los archivos de texto que en los archivos binarios. Además, debe hacer clic en la casilla de verificación junto a su respuesta para marcarla como la respuesta correcta. – Powerlord

9

Para aumentar la respuesta de Miles, el first eight bytes in a PNG file están especialmente diseñados:

  • 89 - el primer byte es un cheque que bit 8 no ha sido despojado
  • "PNG" - dejar que alguien lee que es un formato PNG
  • 0d 0a - al final de la línea indicador de DOS, para comprobar si había DOS-> UNIX conversión
  • 1a - el carbón de fin de archivo DOS acter, para comprobar que el archivo se abrió en modo binario
  • 0a - UNIX carácter de fin de línea, a verificación si había un unix> DOS conversión

Su código se detiene en el 1a, como fue diseñado.

Cuestiones relacionadas