md5 return toHexString

Johannes Pfau via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Apr 24 12:39:35 PDT 2015


Am Fri, 24 Apr 2015 18:02:57 +0000
schrieb "AndyC" <andy at 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.


More information about the Digitalmars-d-learn mailing list