Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Buffer to string

Reply
Thread Tools

Buffer to string

 
 
Jari Williamsson
Guest
Posts: n/a
 
      11-08-2007
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

 
Reply With Quote
 
 
 
 
elof@elof.dk
Guest
Posts: n/a
 
      11-08-2007

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
<(E-Mail Removed)> 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



 
Reply With Quote
 
 
 
 
Paul Irofti
Guest
Posts: n/a
 
      11-08-2007
On 2007-11-08, Jari Williamsson <(E-Mail Removed)> 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
 
Reply With Quote
 
elof@elof.dk
Guest
Posts: n/a
 
      11-08-2007

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, <(E-Mail Removed)> 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
> <(E-Mail Removed)> 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



 
Reply With Quote
 
Paul Irofti
Guest
Posts: n/a
 
      11-08-2007
On 2007-11-08, http://www.velocityreviews.com/forums/(E-Mail Removed) <(E-Mail Removed)> 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
 
Reply With Quote
 
Tom M
Guest
Posts: n/a
 
      11-08-2007
On Nov 8, 7:24 am, Jari Williamsson
<(E-Mail Removed)> 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?


 
Reply With Quote
 
Jari Williamsson
Guest
Posts: n/a
 
      11-08-2007
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

 
Reply With Quote
 
Paul Irofti
Guest
Posts: n/a
 
      11-08-2007
On 2007-11-08, Tom M <(E-Mail Removed)> wrote:
> On Nov 8, 7:24 am, Jari Williamsson
><(E-Mail Removed)> 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
 
Reply With Quote
 
Paul Irofti
Guest
Posts: n/a
 
      11-08-2007
On 2007-11-08, Jari Williamsson <(E-Mail Removed)> 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
 
Reply With Quote
 
Paolo Bonzini
Guest
Posts: n/a
 
      11-08-2007
On Nov 8, 3:38 pm, Tom M <(E-Mail Removed)> wrote:
> On Nov 8, 7:24 am, Jari Williamsson
>
> <(E-Mail Removed)> 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"]

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
buffer creates only read-only buffer? Neal Becker Python 0 01-08-2009 01:58 AM
When using System.IO.FileStream, I write 8 bytes, then seek to the start of the file, does the 8 bytes get flushed on seek and the buffer become a readbuffer at that point instead of being a write buffer? DR ASP .Net 2 07-29-2008 09:50 AM
When using System.IO.FileStream, I write 8 bytes, then seek to the start of the file, does the 8 bytes get flushed on seek and the buffer become a readbuffer at that point instead of being a write buffer? DR ASP .Net Building Controls 0 07-29-2008 01:37 AM
convert M bit buffer to N bit buffer runcyclexcski@yahoo.com C++ 2 03-26-2007 09:43 AM
How to know the buffer size and increase buffer size in c++ Raja C++ 12 06-21-2004 06:21 PM



Advertisments