ユーザーに、書き込み先のバッファーとサイズを渡すように指示します。明らかに、関数の名前を変更する必要があります。これも少し一般的です。おそらくパラメーターがformat_hash_to_hex_string()
原因であるはずです。hashid
int format_hex_string(unsigned char const *hash, hashid type, char *buffer, size_t buflen)
{
size_t n = mhash_get_block_size(type);
if (buflen < 2 * n + 1)
return -1;
for (size_t i = 0; i < n; i++)
sprintf(&buffer[2*i], "%.2X", hash[i]);
return 0;
}
または、ユーザーが十分なバッファを提供することを信頼している場合:
format_hex_string(unsigned char const *hash, hashid type, char *buffer)
{
size_t n = mhash_get_block_size(type);
for (size_t i = 0; i < n; i++)
sprintf(&buffer[2*i], "%.2X", hash[i]);
}
または、少しいじりたい場合 (これはおそらく を呼び出すよりも高速ですsprintf()
):
int format_hex_string(unsigned char const *hash, hashid type, char *buffer, size_t buflen)
{
static char const hexdigits[] = "0123456789ABCDEF";
size_t n = mhash_get_block_size(type);
if (buflen < 2 * n + 1)
return -1;
for (size_t i = 0; i < n; i++)
{
*buffer++ = hexdigits[hash[i] >> 4];
*buffer++ = hexdigits[hash[i] & 0xF];
}
*buffer = '\0';
return 0;
}
一般的な名前を正当化するには、パラメーターを単純な長さに置き換える方がよいでしょうhashid type
(そうすれば、プログラマーはバッファー長がハッシュ長の少なくとも 2 倍でなければならないことを知っていると合理的に仮定できます)。
int format_hex_string(unsigned char const *binbuffer, size_t binlen, char *hexbuffer)
{
static char const hexdigits[] = "0123456789ABCDEF";
for (size_t i = 0; i < binlen; i++)
{
*hexbuffer++ = hexdigits[binbuffer[i] >> 4];
*hexbuffer++ = hexdigits[binbuffer[i] & 0xF];
}
*hexbuffer = '\0';
}
これは現在、汎用関数です。また、必要に応じてラップして、ハッシュ形式に特化することもできます。ラッパーを使用すると、関数への呼び出しをいくつか書く必要がなくなる場合がありますmhash_get_block_size()
。