Usually hashes are represented as a sequence of hexadecimal digits (naturally, two per byte). You can write the code to write such thing easily using an ostringstream
with the right modifiers:
#include <string>
#include <sstream>
#include <iomanip>
std::string GetHexRepresentation(const unsigned char *Bytes, size_t Length) {
std::ostringstream os;
os.fill('0');
os<<std::hex;
for(const unsigned char *ptr = Bytes; ptr < Bytes+Length; ++ptr) {
os<<std::setw(2)<<(unsigned int)*ptr;
}
return os.str();
}
Arguably, this can also be done more efficiently (and, to my today's eyes, more clearly) "by hand":
#include <string>
std::string GetHexRepresentation(const unsigned char *Bytes, size_t Length) {
std::string ret(Length*2, '\0');
const char *digits = "0123456789abcdef";
for(size_t i = 0; i < Length; ++i) {
ret[i*2] = digits[(Bytes[i]>>4) & 0xf];
ret[i*2+1] = digits[ Bytes[i] & 0xf];
}
return ret;
}
or with good old sprintf
, probably the easiest-to-read method of all:
#include <stdio.h>
#include <string>
std::string GetHexRepresentation(const unsigned char *Bytes, size_t Length) {
std::string ret;
ret.reserve(Length * 2);
for(const unsigned char *ptr = Bytes; ptr < Bytes+Length; ++ptr) {
char buf[3];
sprintf(buf, "%02x", (*ptr)&0xff);
ret += buf;
}
return ret;
}