2009-12-05 3 views
0

Я палил с рубиновыми сокетами, поэтому в итоге я попытался поместить IP-пакет togather, после чего я взял ip-пакет и попытался создать новый такой же, как он.Создать двоичные данные с помощью Ruby?

сейчас моя проблема: если пакет равен: 45 00 00 54 00 00 40 00 40 01 06 e0 7f 00 00 01 7f 00 00 01, и это, очевидно, шестнадцатеричный, то 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) 

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

благодарит заранее.

ответ

0

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

+0

"Вы не можете напрямую отправить IP-пакеты" ??? ru sure ??, и я говорил о заголовках, когда я сказал Wireshark, я также сказал, что я пытаюсь создать пакет, так что это не данные, о которых мы говорим, это заголовок, который я пытаясь создать. если у вас это неправильно, то извините за то, что не очень хорошо объясняли. – Raafat

3

Начиная с шестнадцатого экземпляра 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" 

Или использовать массив # упаковка:

>> [1,2].pack 'c*' 
=> "\001\002" 
+0

благодарю вас за интересный ответ, но я уже сделал пакет, как и указал на последний из них, и поставил примечание «я конвертировал каждые 32 бита вместе, а не как писал», но еще раз спасибо, я мог бы намекнуть мне ответ, который я ищу. одна последняя вещь, есть ли другой способ решить все это, могу ли я, например, написать непосредственно в буфере сокета данные, которые я хочу отправить? – Raafat

+1

Ну, вы могли бы сделать что-то вроде: 'a =% w {45 00 00 54 00 00 40 00 40 01 06 e0 7f 00 00 01 7f 00 00 01}; @ socket.send [a.join ''] .pack ('H *'), @ address' или, альтернативно, что-то вроде '@socket.отправить (['45000054000040 ...']. pack ('H *'), @address) ' – DigitalRoss

Смежные вопросы