2

ルビーの文字列に対してビット演算を実行するにはどうすればよいですか?bitwise &のような4バイトの長さの16進数で4バイトの文字列を作成したいと思い("abcd" & 0xDA2DFFD3)ます。文字列のバイト値を取得できません。ご協力いただきありがとうございます。

4

1 に答える 1

3

常に4バイトの文字列を操作する場合はString#unpack、引数を指定すると、'V'4バイトがリトルエンディアンのバイト順でunsignedlongとして扱われます。を使用'N' すると、ネットワークのバイト順序が強制され、を使用'L'すると、ネイティブの順序が使用されます。unpack常に配列を返すため、インデックス0を取得する必要があることに注意してください。

>> '0x%X' % ('abcd'.unpack('V')[0] & 0xDA2DFFD3)
=> "0x40216241"

常に4バイトであるとは限らない場合は、を呼び出しString#bytesて文字列のバイトを取得してから、を使用Enumerable#injectしてバイトを数値に累積することができます。

>> "abcd".bytes.inject {|x, y| (x << 8) | y}
=> 1633837924
>> "abcd".bytes.inject {|x, y| (x << 8) | y}.to_s(16)
=> "61626364"
>> "abcd".bytes.inject {|x, y| (x << 8) | y} & 0xDA2DFFD3
=> 1075864384
>> "0x%X" % ("abcd".bytes.inject {|x, y| (x << 8) | y} & 0xDA2DFFD3)
=> "0x40206340"

ASCII文字列を使用している限り、これは「安全」です。マルチバイト文字列の使用を開始すると、「奇妙な」結果が得られます。

于 2010-05-02T18:22:42.713 に答える