整数と16進数文字列の相互変換
to_s と to_i を使います。
> 0xabcd.to_s(16)
=> "abcd"
> "abcd".to_i(16)
=> 43981
> 0xabcd
=> 43981
文字列と16進数文字列の相互変換
pack と unpack を使います。目に見えない文字列の内容を調べるときに重宝します。
> 'abcd'.unpack('H*').first
=> "61626364"
> ['61626364'].pack('H*')
=> "abcd"
整数と文字列の相互変換
不正なコードポイントの範囲も含めて、文字列をつくるには pack を使います。
> [0xabcd.to_s(16)].pack("H*")
=> "\xAB\xCD"
> "\xab\xcd".unpack('H*').first.to_i(16)
=> 43981
> 0xabcd
=> 43981
エンコーディングを調べるには encoding
プロパティにアクセスします。エンコーディングを変更するには force_encoding を使います。
> "\xab\xcd".encoding
=> #<Encoding:UTF-8>
> "\xab\xcd".force_encoding('cp932').encoding
=> #<Encoding:Windows-31J>
Unicode 以外のレガシーエンコーディングの場合、有効なコードポイントの範囲であれば chr を使って文字列を生成することができます。
> 0x82a0.chr('cp932')
=> "\x{82A0}"
不正な範囲では、エラーになります。
> 0xffff.chr('cp932')
RangeError: invalid codepoint 0xFFFF in Windows-31J
フォールバックの文字を指定するのであれば rescue を使います。
begin
c = 0xffff.chr('cp932')
rescue RangeError => ex
c = '?'
end
puts c
有効な文字列であれば ord を使うことができます。
> "\x82\xA0".force_encoding('cp932').ord
=> 33440
irb(main):031:0> 0x82a0
=> 33440
フォールバックの値を用意するには rescue を使います。
begin
c = '\xff\xff'.force_encoding('cp932').ord
rescue ArgumentError => ex
c = '?'.force_encoding('cp932').ord
end
puts c.to_s(16)