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.

Sonn Y. 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.

Alex Y. wrote:

Sonn Y. 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!

Sonn Y. [email protected] 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.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs