побитовые операции над строками с рубином - PullRequest
1 голос
/ 02 мая 2010

Как я могу выполнять побитовые операции над строками в ruby? Я хотел бы сделать bitwise & 4-байтовую строку с 4-байтовым длинным гексом, например ("abcd" & 0xDA2DFFD3). Я не могу получить байтовые значения строки. Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 02 мая 2010

Если вы всегда собираетесь работать с 4-байтовыми строками, String#unpack с аргументом 'V' будет обрабатывать четыре байта как длинную без знака в порядке байтов с прямым порядком байтов. Использование 'N' вызовет порядок сетевых байтов, а использование 'L' будет использовать собственный порядок. Обратите внимание, что unpack всегда возвращает массив, поэтому необходимо взять индекс 0.

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

Если это не всегда четыре байта, вы можете позвонить 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. Если вы начнете использовать многобайтовые строки, вы получите «странные» результаты.

...