Создать двоичные данные, используя Ruby? - PullRequest
0 голосов
/ 05 декабря 2009

Я работал с рубиновыми сокетами, поэтому я попытался собрать IP-пакет вместе, затем я взял IP-пакет и попытался создать новый точно так же, как он.

Теперь моя проблема: если пакет: 45 00 00 54 00 00 40 00 40 01 06 e0 7f 00 00 01 7f 00 00 01, и это явно шестнадцатеричный код, поэтому я преобразовал его в десятичную, затем в двоичные данные, используя метод .pack, и передал его методу send. тогда Wireshark показывает мне очень странную вещь, отличную от того, что я создал, я делаю что-то не так ???, я знаю это, но не могу понять:

@packet = 0x4500005400004000400106e07f0000017f000001 #i converted each 32 bits together, not like i wrote
@data = ""
@data << @packet.to_s
@socket.send(@data.unpack(c*).to_s,@address)

и есть ли другой способ решить все это, могу ли я, например, записать непосредственно в буфер сокета данные, которые я хочу отправить ??

спасибо заранее.

Ответы [ 2 ]

3 голосов
/ 06 декабря 2009

Начиная с шестнадцатеричного 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"
0 голосов
/ 06 декабря 2009

Сначала проверьте порядок байтов вашего хоста, потому что то, что вы видите в wireshark, находится в сетевом порядке байтов (BigEndian). Затем в wireshark вы увидите заголовки протокола (в зависимости от того, является ли он сокетом TCP или UDP), за которым следуют данные. Вы не можете напрямую отправлять IP-пакеты. Таким образом, вы можете увидеть эти конкретные данные в разделе данных конкретного пакета, то есть (раздел данных пакета TCP / UDP).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...