ruby - convertir - como decodificar base64
Decodificar la cadena base64 y escribir en el archivo (1)
No sé cómo se las arregla para hacer esto, pero los finales de línea /r/n
en su cadena parecen estar ahí como secuencias de caracteres de 4 bytes, no como CRLF
escapado de 2 bytes. Si copio su archivo en una cadena de rubí con un solo ticks:
unescaped=''PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cmV2aWV3LWNhc2UgY3JlYXRl/r/nZGF0ZT0iMTMvTWFyLzIwMTQgMDk6MDQ6NTEiIHN5c3RlbT0iVHJhZmlndXJhX1RlbXBsYXRlX01h/r/nbmFnZW1lbnRfdjUuMSIgYmF0Y2hpZD0iMCIgdHJhbnNhY3Rpb25ubz0iMSIgYmF0Y2huYW1lPSJH''
Base64.decode64(unescaped)
#=> garbled text for every second line
Si hago lo mismo con comillas dobles (que respetan las secuencias de escape):
escaped="PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cmV2aWV3LWNhc2UgY3JlYXRl/r/nZGF0ZT0iMTMvTWFyLzIwMTQgMDk6MDQ6NTEiIHN5c3RlbT0iVHJhZmlndXJhX1RlbXBsYXRlX01h/r/nbmFnZW1lbnRfdjUuMSIgYmF0Y2hpZD0iMCIgdHJhbnNhY3Rpb25ubz0iMSIgYmF0Y2huYW1lPSJH"
Base64.decode64(escaped)
#=> all is well that ends well
Por lo tanto, el problema parece ocurrir al escribir el archivo. Se puede modificar en Ruby sin embargo:
unescaped=''PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cmV2aWV3LWNhc2UgY3JlYXRl/r/nZGF0ZT0iMTMvTWFyLzIwMTQgMDk6MDQ6NTEiIHN5c3RlbT0iVHJhZmlndXJhX1RlbXBsYXRlX01h/r/nbmFnZW1lbnRfdjUuMSIgYmF0Y2hpZD0iMCIgdHJhbnNhY3Rpb25ubz0iMSIgYmF0Y2huYW1lPSJH''
Base64.decode64(unescaped)
escaped=unescaped.gsub(''//r'', "/r").gsub(''//n'', "/n")
Base64.decode64(escaped)
#=> now you should be fine again
pero, por supuesto, la solución correcta sería almacenar el archivo correctamente.
Dado su archivo actual, lo siguiente debería funcionar:
require "base64"
content = File.read(''Input.txt'')
content.gsub!(''//r'', "/r")
content.gsub!(''//n'', "/n")
decode_base64_content = Base64.decode64(content)
File.open("Output.txt", "wb") do |f|
f.write(decode_base64_content)
end
Por favor, publicar algo de salida si no lo hace.
Estoy intentando leer el archivo que contiene la cadena codificada en base64 y escribir la salida descodificada en otro archivo. My Input.txt
contiene una cadena base64, algo como:
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cmV2aWV3LWNhc2UgY3JlYXRl/r/nZGF0ZT0iMTMvTWFyLzIwMTQgMDk6MDQ6NTEiIHN5c3RlbT0iVHJhZmlndXJhX1RlbXBsYXRlX01h/r/nbmFnZW1lbnRfdjUuMSIgYmF0Y2hpZD0iMCIgdHJhbnNhY3Rpb25ubz0iMSIgYmF0Y2huYW1lPSJH/r/nVUlEKGY1NWRmYjgwODQ4ZDQ3YzliZmVhYTg3YzMyZDQyNDQyKS1HTE9CQUxfSU5WT0lDRS1FTkdM/r/nSVNIIiB2ZXJzaW9uPSI1LjEuMi44ICBidWlsZCA1MjUzOSI+PHRyYW5zYWN0aW9uPjxvYmplY3Rz/r/nPjxvYmplY3QgY2xhc3M9IlRoXzE5NTQwMDk3OTRfNl9tb2RlbCIgbmFtZT0ibW9kZWwiPjxwcm9w/r/nZXJ0eSBuYW1lPSJUaXRsZSIgdmFsdWU9IlByb3Zpc2lvbmFsIEludm9pY2UiLz48cHJvcGVydHkg/r/nbmFtZT0iR3JvdXBDb21wYW55Ij48b2JqZWN0IGNsYXNzPSJUaF8xOTU0MDA5Nzk0XzZfR3JvdXBD/r/nb21wYW55IiBuYW1lPSJHcm91cENvbXBhbnkiPjxwcm9wZXJ0eSBuYW1lPSJOYW1lIiB2YWx1ZT0i/r/nVHJhZmlndXJhIEJlaGVlciBCLlYuIEFNU1RFUkRBTSwgQlJBTkNIIE9GRklDRSBMVUNFUk5FIi8+/r/nPHByb3BlcnR5IG5hbWU9IkFkZHJlc3MiIHZhbHVlPSJaPz9yaWNoc3RyYXNzZSAzMSIgaW5kZXg9/r/nIjAiLz48cHJvcGVydHkgbmFtZT0iQWRkcmVzcyIgdmFsdWU9Ikx1Y2VybmUiIGluZGV4PSIxIi8+/r/nPHByb3BlcnR5IG5hbWU9IkFkZHJlc3MiIHZhbHVlPSI2MDAyIiBpbmRleD0iMiIvPjxwcm9wZXJ0/r/neSBuYW1lPSJBZGRyZXNzIiB2YWx1ZT0iU3dpdHplcmxhbmQiIGluZGV4PSIzIi8+PHByb3BlcnR5/r/nIG5hbWU9IlBob25lTnVtYmVyIiB2YWx1
Esta cadena se crea en el lado del servidor con la biblioteca Java apache codec.binary.Base64. Esta cadena se captura con Fiddler cuando dos servicios web diferentes se comunican entre sí. A veces no tengo acceso a otro servicio web, por eso detecto mensajes entre servicios. Además, utilizo Ruby para automatizar algunas tareas de rutina y esta vez decidí usar Ruby nuevamente. Para codificar la cadena base64 capturada, uso el siguiente fragmento de código:
require "base64"
content = File.read(''Input.txt'')
decode_base64_content = Base64.decode64(content)
File.open("Output.txt", "wb") do |f|
f.write(decode_base64_content)
end
Pero la salida se ve mal formada, como <?xml version="1.0" encoding="UTF-8"?><review-case create®vFFSТ#2фЦ"у#B“ЈCЈS"7—7FVУТ%G&f–wW&хFVЧЖFUфЦзnagement_v5.1" ba
y así sucesivamente. ¿Puede por favor asesorarme sobre lo que estoy haciendo mal? Uso Ruby 1.9.3 en Windows 7 y Ubuntu 12.04.