String created from buffer has wrong length and strip() result is incorrect
Lucas Burson via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Oct 17 17:32:09 PDT 2014
On Friday, 17 October 2014 at 17:40:09 UTC, ketmar via
Digitalmars-d-learn wrote:
> i developed a habit of making such buffers one byte bigger than
> necessary and just setting the last byte to 0 before
> converting. this
> way it's guaranteed to be 0-terminated.
Perfect, great idea. Below is my utility method to pull strings
out of a buffer.
/**
* Get a string from buffer where the string spans [offset_start,
offset_end).
* Params:
* buffer = Buffer with an ASCII string to obtain.
* offset_start = Beginning byte offset within the buffer
where the string starts.
* offset_end = Ending byte offset which is not included in
the string.
*/
string bufferGetString(ubyte[] buffer, ulong offset_start, ulong
offset_end)
in
{
assert(buffer != null);
assert(offset_start < offset_end);
assert(offset_end <= buffer.length);
}
body
{
ulong bufflen = offset_end - offset_start;
// add one to the lenth for null-termination
ubyte[] temp = new ubyte[bufflen+1];
temp[0..bufflen] = buffer[offset_start..offset_end];
temp[bufflen] = '\0';
return strip(to!string(cast(const char*) temp.ptr));
}
unittest
{
ubyte[] no_null = [' ', 'A', 'B', 'C', ' '];
assert("ABC" == bufferGetString(no_null, 0, no_null.length));
assert("ABC" == bufferGetString(no_null, 1, no_null.length-1));
assert("A" == bufferGetString(no_null, 1, 2));
}
More information about the Digitalmars-d-learn
mailing list