md5 return toHexString
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
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
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
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.