Thread overview
md5 return toHexString
Apr 24, 2015
AndyC
Apr 24, 2015
tcak
Apr 24, 2015
AndyC
Apr 24, 2015
Johannes Pfau
April 24, 2015
Hi All, I cannot seem to understand whats wrong with this:

// main.d
import std.stdio;
import std.digest.md;
import std.file;


string md5sum(const string fname)
{
    MD5 hash;

    File f = File(fname, "rb");
    foreach( ubyte[] buf; f.byChunk(4096))
    {
        hash.put(buf);
    }

    string s = toHexString!(LetterCase.lower)(hash.finish());
    writeln(s);   //This is correct
    return s;
}

void main()
{
    string crc = md5sum("main.d");
    writeln(crc);  //This is garbage
}


The writeln in md5sum prints correctly, but the "return s" seems to mess it up?  What's going on?

Thanks for you time,

-Andy
April 24, 2015
On Friday, 24 April 2015 at 17:50:03 UTC, AndyC wrote:
> Hi All, I cannot seem to understand whats wrong with this:
>
> // main.d
> import std.stdio;
> import std.digest.md;
> import std.file;
>
>
> string md5sum(const string fname)
> {
>     MD5 hash;
>
>     File f = File(fname, "rb");
>     foreach( ubyte[] buf; f.byChunk(4096))
>     {
>         hash.put(buf);
>     }
>
>     string s = toHexString!(LetterCase.lower)(hash.finish());
>     writeln(s);   //This is correct
>     return s;
> }
>
> void main()
> {
>     string crc = md5sum("main.d");
>     writeln(crc);  //This is garbage
> }
>
>
> The writeln in md5sum prints correctly, but the "return s" seems to mess it up?  What's going on?
>
> Thanks for you time,
>
> -Andy

Just do that "return s.dup()". Then it works for me. That's probably due to the fact that s is in stack. But I am not sure how "toHexString" works.
April 24, 2015
On Friday, 24 April 2015 at 17:56:59 UTC, tcak wrote:
> On Friday, 24 April 2015 at 17:50:03 UTC, AndyC wrote:
>> Hi All, I cannot seem to understand whats wrong with this:
>>
>> // main.d
>> import std.stdio;
>> import std.digest.md;
>> import std.file;
>>
>>
>> string md5sum(const string fname)
>> {
>>    MD5 hash;
>>
>>    File f = File(fname, "rb");
>>    foreach( ubyte[] buf; f.byChunk(4096))
>>    {
>>        hash.put(buf);
>>    }
>>
>>    string s = toHexString!(LetterCase.lower)(hash.finish());
>>    writeln(s);   //This is correct
>>    return s;
>> }
>>
>> void main()
>> {
>>    string crc = md5sum("main.d");
>>    writeln(crc);  //This is garbage
>> }
>>
>>
>> The writeln in md5sum prints correctly, but the "return s" seems to mess it up?  What's going on?
>>
>> Thanks for you time,
>>
>> -Andy
>
> Just do that "return s.dup()". Then it works for me. That's probably due to the fact that s is in stack. But I am not sure how "toHexString" works.


Ah, yep, that works.  I'd originally written it as:
return toHexString!(LetterCase.lower)(hash.finish());

Which doesn't work, so used the temp string to test it.

Now I'm using:
return toHexString!(LetterCase.lower)(hash.finish()).dup();

Kinda weird.  But works.  Thank you!

-Andy
April 24, 2015
Am Fri, 24 Apr 2015 18:02:57 +0000
schrieb "AndyC" <andy@squeakycode.net>:

> On Friday, 24 April 2015 at 17:56:59 UTC, tcak wrote:
> > On Friday, 24 April 2015 at 17:50:03 UTC, AndyC wrote:
> >> Hi All, I cannot seem to understand whats wrong with this:
> >>
> >> // main.d
> >> import std.stdio;
> >> import std.digest.md;
> >> import std.file;
> >>
> >>
> >> string md5sum(const string fname)
> >> {
> >>    MD5 hash;
> >>
> >>    File f = File(fname, "rb");
> >>    foreach( ubyte[] buf; f.byChunk(4096))
> >>    {
> >>        hash.put(buf);
> >>    }
> >>
> >>    string s = toHexString!(LetterCase.lower)(hash.finish());
> >>    writeln(s);   //This is correct
> >>    return s;
> >> }
> >>
> >> void main()
> >> {
> >>    string crc = md5sum("main.d");
> >>    writeln(crc);  //This is garbage
> >> }
> >>
> >>
> >> The writeln in md5sum prints correctly, but the "return s" seems to mess it up?  What's going on?
> >>
> >> Thanks for you time,
> >>
> >> -Andy
> >
> > Just do that "return s.dup()". Then it works for me. That's probably due to the fact that s is in stack. But I am not sure how "toHexString" works.
> 
> 
> Ah, yep, that works.  I'd originally written it as:
> return toHexString!(LetterCase.lower)(hash.finish());
> 
> Which doesn't work, so used the temp string to test it.
> 
> Now I'm using:
> return toHexString!(LetterCase.lower)(hash.finish()).dup();
> 
> Kinda weird.  But works.  Thank you!
> 
> -Andy

https://issues.dlang.org/show_bug.cgi?id=9279

toHexstring doesn't return a string, it returns char[n], a fixed-size array of length n. It shouldn't implicitly convert to a string.