Начиная с шестнадцатеричного Bignum, это новая идея, хотя я не могу сразу придумать, как ее использовать.
В любом случае, проблема начинается с .to_s
на Bignum, что приведет к созданию строки с десятичным представлением вашего числа, что приведет вас гораздо дальше от битов, а не ближе. Каким-то образом ваши c*
, похоже, тоже потеряли свои цитаты.
Но, помещая их обратно, вы затем распаковываете строку, которая возвращает массив целых чисел, которые являются значениями ascii цифр в десятичном представлении числового значения исходной шестнадцатеричной строки, а затем вы .to_s
, что (который IO сделал бы в любом случае, так что, по крайней мере, там нет вины), но тогда это приводит к строке с печатным представлением чисел ascii неупакованной строки, так что теперь вы находитесь в световых годах от первоначального намерения.
>> t = 0x4500005400004000400106e07f0000017f000001
=> 393920391770565046624940774228241397739864195073
>> t.to_s
=> "393920391770565046624940774228241397739864195073"
>> t.to_s.unpack('c*')
=> [51, 57, 51, 57, 50, 48, 51, 57, 49, 55, 55, 48, 53, 54, 53, 48, 52, 54, 54, 50, 52, 57, 52, 48, 55, 55, 52, 50, 50, 56, 50, 52, 49, 51, 57, 55, 55, 51, 57, 56, 54, 52, 49, 57, 53, 48, 55, 51]
>> t.to_s.unpack('c*').to_s
=> "515751575048515749555548535453485254545052575248555552505056505249515755555157565452495753485551"
Это довольно интересно. Вся информация все еще там, вроде.
В любом случае вам нужно создать двоичную строку. Либо просто <<
чисел в нем:
>> s = ''; s << 1 << 2
=> "\001\002"
Или используйте Array # pack:
>> [1,2].pack 'c*'
=> "\001\002"