From: Greg Chambers Date: 2009-07-08T08:03:14+09:00 Subject: Re: Question on networking with custom binary interface. Thanks for help of the first question. As for the second question, no the field is not fixed length. The only guarantees are that the string is the only variable length field, it is null terminated, it's start byte is known, and the length of the entire packet is known. Any ideas? On 7/7/09, Joel VanderWerf wrote: > Greg Chambers wrote: >> I've been using BitStruct and it works like a dream except in one area, >> which is with strings. My first test class I am making keeps it easy by >> putting it at the end of the packet so I can just use a rest field. And >> although the output returned by description looks fine, when I convert >> to a String for sending, the string is added on as is instead of >> converted like all the other data. Here was the test code I wrote: > ... >> "\000\000\000\030\000\000\002\003Testing 01 10 11" >> >> This output is fine until it gets to the string. I just worry, like I >> did above, because the program receiving this needs to see the string as >> a null terminated *char string... did I say that right? Don't know >> enough C for this. > > I see your point. You can of course add the null manually: > > test_packet.text_msg = "Testing 01 10 11\0" > > but that's kinda defeating the purpose of bit-struct. > > Another thing you can do is define reader/writer methods that > strip/append the null. Rename the field to _text_msg and define: > > def text_msg; _text_msg[/(.*)\0\z/, 1]; end > def text_msg=(s); self._text_msg = "#{s}\0"; end > > It would be easy to add this to bit-struct, I'm just not sure what the > api should be. Maybe an option like > > rest :text_str, :terminator => "\0" > > Thoughts? > >> Anyways, that was my first question. The second question is how would I >> go about converting a binary string I received into a BitStruct when >> there is a variable length, null terminated string in the center of the >> binary string? Figured I would ask since using a rest field won't work >> here. > > Is the field fixed length, even if the string itself is variable length? > If so, you can use a #text field, which pads with null chars: > > require 'bit-struct' > > class Msg < BitStruct > unsigned :x, 16 > text :str, 10*8 > unsigned :y, 16 > end > > m = Msg.new(:x => 1, :str => "foo", :y => 2) > p m > p m.to_s > > __END__ > > # > "\000\001foo\000\000\000\000\000\000\000\000\002" > > -- > vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407 > > -- Sent from my mobile device