gpt4 book ai didi

ruby-on-rails - Encoding::UndefinedConversionError 写入二进制文件时

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:19 26 4
gpt4 key购买 nike

我有一个网站需要加密和存储上传到服务器的二进制文件。上传和存储工作正常,但在尝试写入加密文件时出现此错误:

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

导致错误的行是while循环中的file_out << cipher.update(chunk)。我在网上调查过这个问题,发现了一些类似 ASCII/UTF 转换问题的报告,但它们似乎都是基于强制字符串输入,而不是流文件输入。我使用的是 Ruby 1.9.2,我认为它会影响默认字符串编码。

关于为什么(我认为)我需要使用基于流的方法的基本原理:文件往往很大,我不想将整个文件(输入或输出)加载到内存中来处理它。

感谢任何帮助。谢谢。

最佳答案

当加密/解密将输入和输出视为原始字节时,您想要做的是不惜一切代价避免因将编码与数据相关联而导致的任何转码。所以你应该以二进制模式打开你的文件,既可以读也可以写。

实际上你这样做了,但是使用了 IO#sysopen,但是你在使用 IO#open 时没有传递“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

关于ruby-on-rails - Encoding::UndefinedConversionError 写入二进制文件时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6811207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com