ruby 解码 base64 字符串并写入文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23488404/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 06:28:23  来源:igfitidea点击:

Decode base64 string and write to file

rubybase64

提问by olyv

I'm trying to read file which contains encoded base64 string and write decoded output into another file. My Input.txtcontains a base64 string, something like:

我正在尝试读取包含编码的 base64 字符串的文件并将解码的输出写入另一个文件。我的Input.txt包含一个 base64 字符串,类似于:

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

This string is created on server side with Java apache codec.binary.Base64 library. This string is captured with Fiddler when two different web services communicates with each other. Sometimes I have no access to the another web-service, that is why I sniff messages between services. In addition I use Ruby to automate some routine tasks and decided this time to use Ruby again. For encoding captured base64 string I use next snippet of code:

该字符串是在服务器端使用 Java apache codec.binary.Base64 库创建的。当两个不同的 Web 服务相互通信时,此字符串由 Fiddler 捕获。有时我无法访问另一个网络服务,这就是我嗅探服务之间消息的原因。此外,我使用 Ruby 来自动化一些日常任务,并决定这次再次使用 Ruby。为了编码捕获的 base64 字符串,我使用下一段代码:

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 

But output looks malformed, like <?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" baand so on. Can you please advise on what I'm doing wrong? I use Ruby 1.9.3 on Windows 7 and Ubuntu 12.04.

但是输出看起来格式不正确,诸如此类<?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。你能告诉我我做错了什么吗?我在 Windows 7 和 Ubuntu 12.04 上使用 Ruby 1.9.3。

采纳答案by Patru

I do not know how you manage to do this, but the line endings \r\nin your string seem to be there as 4-byte character sequences, not as 2-byte escaped CRLF. If I copy your file into a ruby string with single ticks:

我不知道您是如何做到这一点的,但是\r\n您的字符串中的行尾似乎是 4 字节字符序列,而不是 2 字节转义字符CRLF。如果我将您的文件复制到带有单个刻度的 ruby​​ 字符串中:

unescaped='PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cmV2aWV3LWNhc2UgY3JlYXRl\r\nZGF0ZT0iMTMvTWFyLzIwMTQgMDk6MDQ6NTEiIHN5c3RlbT0iVHJhZmlndXJhX1RlbXBsYXRlX01h\r\nbmFnZW1lbnRfdjUuMSIgYmF0Y2hpZD0iMCIgdHJhbnNhY3Rpb25ubz0iMSIgYmF0Y2huYW1lPSJH'
Base64.decode64(unescaped)
#=> garbled text for every second line

if I do the same with double quotes (which respect the escape sequences):

如果我用双引号(尊重转义序列)做同样的事情:

escaped="PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cmV2aWV3LWNhc2UgY3JlYXRl\r\nZGF0ZT0iMTMvTWFyLzIwMTQgMDk6MDQ6NTEiIHN5c3RlbT0iVHJhZmlndXJhX1RlbXBsYXRlX01h\r\nbmFnZW1lbnRfdjUuMSIgYmF0Y2hpZD0iMCIgdHJhbnNhY3Rpb25ubz0iMSIgYmF0Y2huYW1lPSJH"
Base64.decode64(escaped)
#=> all is well that ends well

Therefore the problem seems to occur when you write the file. It can be amended in Ruby though:

因此,当您写入文件时似乎会出现问题。不过,它可以在 Ruby 中修改:

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

but of course the correct solution would be to store the file correctly.

但当然正确的解决方案是正确存储文件。

Given your current file the following should work:

鉴于您当前的文件,以下内容应该有效:

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

Please do post some output if it does not.

如果没有,请发布一些输出。