RubyでString.newデビューした

Rubyでバイナリ文字列と文字列リテラルを比較すると、、、

it { expect([255].pack("v")).to eq "\xFF\x00" }
     Failure/Error: it { expect([255].pack("v")).to eq "\xFF\x00" }
     
       expected: "\xFF\u0000"
            got: "\xFF\x00"
     
       (compared using ==)

環境

なにが起こった?

すなわち、

> "\xFF\x00".encoding
=> #<Encoding:UTF-8>
> [255].pack("v").encoding
=> #<Encoding:ASCII-8BIT>

対策

期待値の文字列のエンコーディングをASCII-8BITを指定できれば良い。 String.newによってエンコーディングが可能。エンコーディング指定による変換も行われない。

> String.new("\xFF\x00", encoding: "ASCII-8BIT").encoding
=> #<Encoding:ASCII-8BIT>

参考

追記

String#bの方が便利かもしれません。