Ruby 1.8 to 1.9: バイト文字列比較

JPEGファイル検査をするときのように、あるファイルの特定の バイト列を比較するときの話。

やりたいのはこんな感じ。JPEGファイルは先頭2バイトが 0xFF, 0xD8 になっている。その先頭2バイトを IO.read で読んで "\xFF\xD8" と比較してもRuby 1.9はNG。

open("jpegfile", "r") do |j|
  magic = j.read(2)
  if magic == "\xFF\xD8"
    ...
  end
end

がっくし。スクリプト自体がマルチバイトエンコーディングになってると 同じバイト列でも違うと判定される。 "\xFF\xD8".force_encoding("ascii-8bit") とか しないと、とか、I know, I know, but...

Ruby 1.8でも動くようにするにはどうすんの。短いの希望。

次のどちらかかな。

  if magic.unpack('C*') == "\xFF\xD8".unpack("C*") then ... end

  if magic.bytes.to_a == "\xFF\xD8".bytes.to_a then ... end

面倒じゃのう。

Ruby 1.9 Process::Status で to_int

Process.wait したあとで、$?.to_int にアクセスすると そこで動きが止まっちゃう。$?.to_i ならだいじょぶ。 なじぇ。