加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 编写二进制文件时的Encoding :: UndefinedConv

发布时间:2020-12-16 20:38:58 所属栏目:百科 来源:网络整理
导读:我有一个网站需要加密和存储上传到服务器的二进制文件.上传和存储工作正常,但尝试写入加密文件时会收到此错误: Encoding::UndefinedConversionError (“xDD” from ASCII-8BIT to UTF-8): 导致它的代码如下所示: fd_in = IO.sysopen(self[:name].tempfile
我有一个网站需要加密和存储上传到服务器的二进制文件.上传和存储工作正常,但尝试写入加密文件时会收到此错误:

Encoding::UndefinedConversionError (“xDD” from ASCII-8BIT to UTF-8):

导致它的代码如下所示:

fd_in = IO.sysopen(self[:name].tempfile.path,"rb")                           
file_in = IO.open(fd_in)                                                      
fd_out = IO.sysopen(self[:name].tempfile.path + ".encrypted","wb")           
file_out = IO.open(fd_out)                                                    
cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')                           
cipher.encrypt                                                                                                         
cipher.key = cipher_key                                                     
cipher.iv = cipher_iv                                                       
while chunk = file_in.read(1024)                                              
  file_out << cipher.update(chunk)                                            
end
file_out << cipher.final

导致错误的行是file_out<< while循环中的cipher.update(chunk).我已经看过这个在线,并发现了一些类似的ASCII / UTF转换问题的报告,但它们都是基于强制字符串输入,而不是流文件输入.我使用的是Ruby 1.9.2,我相信它会影响默认的字符串编码. 我的理由为什么(我认为)我需要使用基于流的方法:文件往往是大的,我不想将整个文件(输入或输出)加载到内存中进行处理. 任何帮助是赞赏.谢谢.

解决方法

当您进行/解密时,您要做的是将输入和输出视为原始字节,您希望避免所有费用将编码与数据关联而导致的任何代码转换.所以你应该以二进制模式打开你的文件,无论是阅读还是写作.

其实你这样做,但是使用IO#sysopen,但是当使用IO#打开时,你没有传递“b”标志.

如果你想试试这个,你的代码应该可以工作

fin = File.open("TODO","rb")                           
fout = File.open("TODO.encrypted","wb")           
cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
cipher.encrypt                     
cipher.key = key                                                     
cipher.iv = iv                                                       
while chunk = fin.read(1024)                                              
  fout << cipher.update(chunk)                                            
end
fout << cipher.final
fin.close
fout.close

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读