Is there a standard way of representing an SHA1 hash as a C string, and how do I convert to it?
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;
}
The standard way of representing hashes is as hexadecimal strings.
In C, you can use printf("%02x", byte)
to get a hex representation of each byte.
An example for MD5, should be easy to adapt it for SHA:
http://en.literateprograms.org/MD5_sum_(C,_OpenSSL)
Here is an example for C:
//function
void convertSHA1BinaryToCharStr(const unsigned char * const hashbin, char * const hashstr) {
for(int i = 0; i<20; ++i)
{
sprintf(&hashstr[i*2], "%02X", hashbin[i]);
}
hashstr[40]=0;
}
//Example call. hashbin is the 20byte hash array.
char hashstr[41];
convertSHA1BinaryToCharStr(hashbin, hashstr);
printf("%s\n", hashstr);