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 08:24:21 PDT 2014
On Friday, 17 October 2014 at 08:31:04 UTC, spir via
Digitalmars-d-learn wrote:
> On 17/10/14 09:29, thedeemon via Digitalmars-d-learn wrote:
>> On Friday, 17 October 2014 at 06:29:24 UTC, Lucas Burson wrote:
>>
>>> // This is where things breaks
>>> {
>>> ubyte[] buff = new ubyte[16];
>>> buff[0..ATA_STR.length] = cast(ubyte[])(ATA_STR);
>>>
>>> // read the string back from the buffer, stripping
>>> whitespace
>>> string stringFromBuffer =
>>> strip(cast(string)(buff[0..16]));
>>> // this shows strip() doesn't remove all whitespace
>>> writefln("StrFromBuff is '%s'; length %d",
>>> stringFromBuffer,
>>> stringFromBuffer.length);
>>>
>>> // !! FAILS. stringFromBuffer is length 15, not 3.
>>> assert(stringFromBuffer.length == strip(ATA_STR).length);
>>
>> Unlike C, strings in D are not zero-terminated by default,
>> they are just arrays,
>> i.e. a pair of pointer and size. You create an array of 16
>> bytes and cast it to
>> string, now you have a 16-chars string. You fill first few
>> chars with data from
>> ATA_STR but the rest 10 bytes of the array are still part of
>> the string, not
>> initialized with data, so having zeroes. Since this tail of
>> zeroes is not
>> whitespace (tabs or spaces etc.) 'strip' doesn't remove it.
>
> Side-note: since your string has those zeroes at the end, strip
> only removes the space at start (thus, final size=15), instead
> of at both ends.
>
> d
Okay things are becoming more clear. The cast to string is
nothing like the C++ string ctor, I made a bad assumption.
So given the below buffer would I use fromStringz (is this in the
stdlib?) to cast it from a null-terminated buffer to a good
string? Shouldn't the compiler give a warning about casting a
buffer to a string without using fromStringz?
Buffer = [ 0x20, 0x41, 0x54, 0x41, 0x20, 0x00, 0x00, ...]?
More information about the Digitalmars-d-learn
mailing list