1

这个问题困扰了我一段时间。

我有一个 34.6 KB 的 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 KB,而不是 34.6 KB。我无法访问图像 B。我的 mac 系统提醒我它可能已损坏或正在使用无法识别的文件格式。

相关代码:

//same as before
image_a.each_byte do |b|
  image_b.write(b)
end
//same as before

为什么图像 B 逐字节复制时比图像 A 大?为什么它也会以某种方式、形状或形式受损?为什么图像 A 与 B 大小相同,逐行复制且可访问?

我的猜测是问题是编码问题。如果是这样,如果编码格式转换为正确的代码点,为什么在逐字节复制时编码格式很重要?代码点是否相互混淆,因此解析器无法区分它们?

\s 和 \n 重要吗?好像是这样。我做了一些研究,发现图像 A 有 128 行代码,而图像 B 只有一行。

谢谢阅读!

4

1 回答 1

2

IO#each_byte迭代字节(又名整数)。IO#write但是,将字符串作为参数。所以它通过将整数转换为字符串to_s

鉴于图像中的第一个字节是2551,您可以将字符串"255"写入image_b. 这就是你image_b变大的原因。您将数字字符串写入其中。

写回字节时尝试以下操作:

image_a.each_byte do |l|
  image_b.write l.chr
end

1正如@stefan 指出的 jpeg 图像以FF D8. 所以第一个字节是255.

于 2013-07-31T20:47:12.520 回答