Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   Buffer to string (http://www.velocityreviews.com/forums/t845562-buffer-to-string.html)

Jari Williamsson 11-08-2007 12:24 PM

Buffer to string
 
I have a buffer (stored in a String class) with a NULL-terminated
C-style string inside, what's the most efficient approach to get that
text string up to the NULL?


Best regards,

Jari Williamsson


elof@elof.dk 11-08-2007 01:13 PM

Re: Buffer to string
 

Hi

One approach could be to use split and a regexp:

s = "hi"
s << 0.chr
s << "there"
p s
p s.split(/\000/).first

Kristian

On Thu, 8 Nov 2007 21:24:34 +0900, Jari Williamsson
<jari.williamsson@mailbox.swipnet.se> wrote:
> I have a buffer (stored in a String class) with a NULL-terminated
> C-style string inside, what's the most efficient approach to get that
> text string up to the NULL?
>
>
> Best regards,
>
> Jari Williamsson




Paul Irofti 11-08-2007 01:25 PM

Re: Buffer to string
 
On 2007-11-08, Jari Williamsson <jari.williamsson@mailbox.swipnet.se> wrote:
> I have a buffer (stored in a String class) with a NULL-terminated
> C-style string inside, what's the most efficient approach to get that
> text string up to the NULL?


$ irb
irb(main):001:0> s = "hello\0"
=> "hello\000"
irb(main):002:0> s.chomp("\0")
=> "hello"
irb(main):003:0>

See String#chomp(!) for more details.

--
everything is simple, we're stupid
contact at gmail

elof@elof.dk 11-08-2007 01:33 PM

Re: Buffer to string
 

If you really only ever care about the first string then

s.match(/\000/).pre_match

is an alternative which looks like it could be less work for the machine
since it can stop after the first \000 rather than have to split the entire
string.

Are you looking at strings huge enough that efficiency at this level
matters?

Kristian



On Thu, 8 Nov 2007 22:13:57 +0900, <elof@elof.dk> wrote:
>
> Hi
>
> One approach could be to use split and a regexp:
>
> s = "hi"
> s << 0.chr
> s << "there"
> p s
> p s.split(/\000/).first
>
> Kristian
>
> On Thu, 8 Nov 2007 21:24:34 +0900, Jari Williamsson
> <jari.williamsson@mailbox.swipnet.se> wrote:
>> I have a buffer (stored in a String class) with a NULL-terminated
>> C-style string inside, what's the most efficient approach to get that
>> text string up to the NULL?
>>
>>
>> Best regards,
>>
>> Jari Williamsson




Paul Irofti 11-08-2007 01:37 PM

Re: Buffer to string
 
On 2007-11-08, elof@elof.dk <elof@elof.dk> wrote:
>
> If you really only ever care about the first string then
>
> s.match(/\000/).pre_match
>
> is an alternative which looks like it could be less work for the machine
> since it can stop after the first \000 rather than have to split the entire
> string.
>
> Are you looking at strings huge enough that efficiency at this level
> matters?


I think the OP made it pretty clear: there is *one* C-Style string
inside a String Class buffer and wants to retrive it w/o the zero
termination.
--
everything is simple, we're stupid
contact at gmail

Tom M 11-08-2007 02:38 PM

Re: Buffer to string
 
On Nov 8, 7:24 am, Jari Williamsson
<jari.williams...@mailbox.swipnet.se> wrote:
> I have a buffer (stored in a String class) with a NULL-terminated
> C-style string inside, what's the most efficient approach to get that
> text string up to the NULL?
>
> Best regards,
>
> Jari Williamsson


Would buf.unpack("a*") work?



Jari Williamsson 11-08-2007 02:40 PM

Re: Buffer to string
 
Paul Irofti wrote:

> $ irb
> irb(main):001:0> s = "hello\0"
> => "hello\000"
> irb(main):002:0> s.chomp("\0")
> => "hello"


This particular approach wouldn't work, since it can't be guaranteed
that every byte remaining in the buffer (after the termination) is NULL:
irb(main):001:0> s = "Hello\0\1\0"
=> "Hello\000\001\000"
irb(main):002:0> s.chomp("\0")
=> "Hello\000\001"

But the other suggestions work. Thanks!


Best regards,

Jari Williamsson


Paul Irofti 11-08-2007 02:50 PM

Re: Buffer to string
 
On 2007-11-08, Tom M <thomas.macklin@gmail.com> wrote:
> On Nov 8, 7:24 am, Jari Williamsson
><jari.williams...@mailbox.swipnet.se> wrote:
>> I have a buffer (stored in a String class) with a NULL-terminated
>> C-style string inside, what's the most efficient approach to get that
>> text string up to the NULL?
>>
>> Best regards,
>>
>> Jari Williamsson

>
> Would buf.unpack("a*") work?


Depends on the raw data contained within the C zero terminated string.
If its plain text "a*" wouldn't work, but "Z*" might.

For unpack I'd suggest seeing String#unpack for other formating and the
way to combine the different format markers in order to retrieve the
wanted data.

$ irb
irb(main):001:0> s = "Hello\0"
=> "Hello\000"
irb(main):002:0> s.unpack("a*")
=> ["Hello\000"]
irb(main):003:0> s.unpack("Z*")
=> ["Hello"]

--
everything is simple, we're stupid
contact at gmail

Paul Irofti 11-08-2007 02:53 PM

Re: Buffer to string
 
On 2007-11-08, Jari Williamsson <jari.williamsson@mailbox.swipnet.se> wrote:
> Paul Irofti wrote:
>
>> $ irb
>> irb(main):001:0> s = "hello\0"
>> => "hello\000"
>> irb(main):002:0> s.chomp("\0")
>> => "hello"

>
> This particular approach wouldn't work, since it can't be guaranteed
> that every byte remaining in the buffer (after the termination) is NULL:
> irb(main):001:0> s = "Hello\0\1\0"
>=> "Hello\000\001\000"
> irb(main):002:0> s.chomp("\0")
>=> "Hello\000\001"
>
> But the other suggestions work. Thanks!
>


I did not consider trailing garbage, sorry about that. I thought, from
your original question, that you only have a NULL terminated string and
not anything else.

--
everything is simple, we're stupid
contact at gmail

Paolo Bonzini 11-08-2007 02:53 PM

Re: Buffer to string
 
On Nov 8, 3:38 pm, Tom M <thomas.mack...@gmail.com> wrote:
> On Nov 8, 7:24 am, Jari Williamsson
>
> <jari.williams...@mailbox.swipnet.se> wrote:
> > I have a buffer (stored in a String class) with a NULL-terminated
> > C-style string inside, what's the most efficient approach to get that
> > text string up to the NULL?

>
> > Best regards,

>
> > Jari Williamsson

>
> Would buf.unpack("a*") work?


No, that's buf.unpack("Z*") that you want

irb(main):001:0> s = "hi"
=> "hi"
irb(main):002:0> s << 0.chr
=> "hi\000"
irb(main):003:0> s << "there"
=> "hi\000there"
irb(main):007:0> s.unpack("a*")
=> ["hi\000there"]
irb(main):014:0> s.unpack("Z*")
=> ["hi"]



All times are GMT. The time now is 07:27 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.