1

この問題はしばらくの間私を悩ませました。

34.6 キロバイトの jpeg ファイルがあります。これを画像 A としましょう。Ruby を使用して、画像 A の各行を新しく作成した画像 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 にバイトごとにコピーしようとすると、コピーは成功しますが、ファイル サイズが 34.6 キロバイトではなく 88.9 キロバイトになります。イメージ B にアクセスできません。Mac システムから、イメージ B が破損しているか、認識されないファイル形式を使用している可能性があるという警告が表示されました。

関連コード:

//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 には 1 行しかないことがわかりました。

読んでくれてありがとう!

4

1 に答える 1