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);

Tags:

C++

C

Hash

Openssl