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
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
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
$ 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.
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?
--
everything is simple, we're stupid
contact at gmail
Would buf.unpack("a*") work?
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
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/).firstKristian
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 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
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"]
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?
--
everything is simple, we're stupid
contact at gmail
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"]
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?
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.
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?
--
everything is simple, we're stupid
contact at gmail
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.
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!
--
everything is simple, we're stupid
contact at gmail