[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

could anyone help me in the question, thanks?

Sonn Ygg

6/25/2007 6:02:00 PM

In network application, we need to fill some fields of protocol header
like below (in C):

struct hdr {
unsinged short ver;
unsinged char len;
unsinged char flg;
......
};

int main(void)
{
struct hdr hh;
hh.ver = 0x1;
hh.len = 0x2;
hh.flg = 0x3;
...
send(sock, &hh, sizeof(hh), 0);
...
}

How could I do above in Ruby because I don't find how to specify the
data type of variables or the address of variables in Ruby so far? I
will deeply appreciate if anyone gives me any hint about it? Thanks a
lot.

--
Posted via http://www.ruby-....

3 Answers

Alex Young

6/25/2007 6:36:00 PM

0

Sonn Ygg wrote:
> In network application, we need to fill some fields of protocol header
> like below (in C):
>
> struct hdr {
> unsinged short ver;
> unsinged char len;
> unsinged char flg;
> ......
> };
>
> int main(void)
> {
> struct hdr hh;
> hh.ver = 0x1;
> hh.len = 0x2;
> hh.flg = 0x3;
> ...
> send(sock, &hh, sizeof(hh), 0);
> ...
> }
>
> How could I do above in Ruby because I don't find how to specify the
> data type of variables or the address of variables in Ruby so far? I
> will deeply appreciate if anyone gives me any hint about it? Thanks a
> lot.
>
You only need to worry about the types at the
serialisation/deserialisation interface, and you can do that with
Array#pack and String#unpack. There's also bitstruct at
http://raa.ruby-lang.org/project/b... if your needs are more
complicated.

--
Alex

Sonn Ygg

6/25/2007 6:48:00 PM

0

Alex Young wrote:
> Sonn Ygg wrote:
>> int main(void)
>> How could I do above in Ruby because I don't find how to specify the
>> data type of variables or the address of variables in Ruby so far? I
>> will deeply appreciate if anyone gives me any hint about it? Thanks a
>> lot.
>>
> You only need to worry about the types at the
> serialisation/deserialisation interface, and you can do that with
> Array#pack and String#unpack. There's also bitstruct at
> http://raa.ruby-lang.org/project/b... if your needs are more
> complicated.

Thanks a lot!

--
Posted via http://www.ruby-....

Daniel Martin

6/25/2007 6:54:00 PM

0

Sonn Ygg <ys_manman@hotmail.com> writes:

> How could I do above in Ruby because I don't find how to specify the
> data type of variables or the address of variables in Ruby so far? I
> will deeply appreciate if anyone gives me any hint about it? Thanks a
> lot.

This is exactly the problem that Array.pack was designed to solve.
Quoting from a recent post of mine dealing with network headers in the
FSP protocol: (ruby-talk:256654)

fsp_string = [fsp_pkt.cmd, 0, fsp_pkt.key,
fsp_pkt.seq, fsp_pkt.len, fsp_pkt.pos].pack("CCnnnN")

Basically, make an array containing what you need, then use pack to
stuff it into a byte string with the proper width and alignment. Then
write that byte string to your socket.

--
s=%q( Daniel Martin -- martin@snowplow.org
puts "s=%q(#{s})",s.to_a.last )
puts "s=%q(#{s})",s.to_a.last