数値のバイトを文字列に変換するにはどうすればよいですか? (数値の文字表現)
概要
数値を簡単に変換するにはどうすればよいですか。 0x616263、つまり基数 10 の 6382179 を、数値を連続したバイトに分割して文字列に変換しますか?したがって、上記の例は「abc」に変換されるはずです。
Array.pack を試してみましたが、数値内の複数のバイトを変換する方法がわかりません。 [0x616263].pack(“C*“) は ‘c’ を返します。 0x616263.to_s(256) も試しましたが、ArgumentError:無効な基数がスローされます。何らかのエンコード情報が必要だと思いますか?
(注: N などのパック内の他のデータ型は、上で示した例で動作しますが、それが 4 バイト以内に収まるためにのみ、たとえば [0x616263646566].pack(“N”) は abcdef ではなく cdef を与えます)
この質問はこの質問となんとなく似ていますが、実際には似ていません。また、 “abcde”.unpack(“c*“).map{|c| を使って文字列から 16 進表現の文字列を取得する方法もなんとなくわかりました。 c.to_s(16)}.join(”“)、「6162636465」が得られます。基本的には後戻りしたいと思っています。
これは X-Y の問題ではないと思いますが、問題である場合に備えて、RSA でデコードした数値を文字列に変換しようとしています。
助けていただきありがとうございます。私は Ruby の経験があまりありません。 (趣味で) Python ソリューションにも興味がありますが、この質問に 2 つの異なるプログラミング言語のタグを追加することが正しいかどうかはわかりません。
解決策
1 つの数値 0x00616263 を 3 つの文字に変換するには、まずそれらを 3 つの数値、0x00000061、0x00000062、および 0x00000063 に分割する必要があります。
最後の数値については、必要な 16 進数がすでに正しい位置にあります。ただし、他の 2 つの場合は、それぞれ >> 16 と >> 8 を使用してビットシフトを行う必要があります。
その後、ビットごとの AND (&) を使用して他の数字を削除します。
num1 = (0x616263 >> 16) & 0xFF
num2 = (0x616263 >> 8) & 0xFF
num3 = 0x616263 & 0xFF
文字については、次のようにすることができます。
char1 = ((0x616263 >> 16) & 0xFF).chr
char2 = ((0x616263 >> 8) & 0xFF).chr
char3 = (0x616263 & 0xFF).chr
もちろん、ビット単位の演算はあまり Ruby らしくありません。おそらく、他の誰かが提供する Ruby に似た答えがもっとあるかもしれません。