Could anyone help me in the question, thanks?

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-forum.com/.

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/bit-struct/ if your needs are more complicated.

···

--
Alex

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

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/bit-struct/ if your needs are more
complicated.

Thanks a lot!

···

--
Posted via http://www.ruby-forum.com/\.