md5 return toHexString

2015-04-24 Thread AndyC via Digitalmars-d-learn

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


Re: md5 return toHexString

2015-04-24 Thread tcak via Digitalmars-d-learn

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.


Re: md5 return toHexString

2015-04-24 Thread AndyC via Digitalmars-d-learn

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


Re: md5 return toHexString

2015-04-24 Thread Johannes Pfau via Digitalmars-d-learn
Am Fri, 24 Apr 2015 18:02:57 +
schrieb AndyC a...@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.