这个问题困扰了我一段时间。
我有一个34.6千字节的jpeg文件。我们称之为Image A.使用Ruby,当我将Image A的每一行复制到一个名为Image B的新创建文件时,它会被完全复制。它与图像A的大小完全相同,可以访问。
以下是我使用的代码:
image_a = File.open('image_a.jpg', 'r')
image_b = File.open('image_b.jpg', 'w+')
image_a.each_line do |l|
image_b.write(l)
end
image_a.close
image_b.close
此代码生成image_a的完美副本到image_b。
当我尝试将图像A逐个字节地复制到图像B中时,它成功复制,但文件大小为88.9千字节而不是34.6千字节。我无法访问Image B.我的mac系统提醒我它可能已损坏或正在使用无法识别的文件格式。
相关代码:
//same as before
image_a.each_byte do |b|
image_b.write(b)
end
//same as before
为什么图像B在逐字节复制时大于图像A?为什么它也会以某种方式,形状或形式受损?为什么图像A的大小与B相同,逐行复制并可访问?
我的猜测是问题是编码问题。如果是这样,为什么编码格式在逐字节复制时很重要,如果它们转换为正确的代码点?代码点是否互相混淆,因此解析器无法区分它们?
是否和\ n很重要?看起来好像。我做了一些更多的研究,我发现Image A有128行代码,而Image B只有一行。
感谢阅读!
答案 0 :(得分:2)
IO#each_byte
遍历字节(又称整数)。但是,IO#write
以字符串作为参数。因此它通过to_s
将整数转换为字符串。
鉴于图像中的第一个字节是255
1 ,您将字符串"255"
写入image_b
。这就是你的image_b
变大的原因。你将数字字符串写入其中。
写回字节时请尝试以下操作:
image_a.each_byte do |l|
image_b.write l.chr
end
1 正如@stefan所指出的那样,jpeg图像以FF D8
开头。所以第一个字节是255
。