将格式化的打印值存储在新变量中
Store a formated printed value in a new variable
在加密函数 (sha256) 中,我有用于打印最终结果的代码:
void print_hash(unsigned char hash[])
{
int idx;
for (idx=0; idx < 32; idx++)
printf("%02x",hash[idx]);
printf("\n");
}
当函数中的 hash enter 是这样的:
/A�`�}#.�O0�T����@�}N�?�#=\&@
然后,通过循环,我在控制台中输入了这个
182f419060f17d2319132eb94f30b7548d81c0c740977d044ef1edbb9b97233d
我想知道如何将控制台中的最终值存储在变量中。
我已经阅读了一些关于 sscanf 的内容,但是你能帮我吗?
您可以使用 sprintf
:
将其存储在数组中(通过指针传入参数)
void print_hash(unsigned char hash[], unsigned char output[])
{
int idx;
for (idx = 0; idx < 32; idx++)
sprintf(&output[2 * idx], "%02x", hash[idx]);
}
一定要为output
(即char output[2 * 32 + 1]
)中的空终止符保留一个额外的字节。
使用sprintf
,此函数将其输出(相当于printf
写入控制台的内容)存储在字符串缓冲区中。如何在您的案例中使用它的示例:
char buffer[65]; //Make this buffer large enough for the string and a nul terminator
for(int idx = 0; idx < 32; ++idx)
{
sprintf(&buffer[2*idx], "%02x", hash[idx]); //Write to the correct position in the buffer
}
终止 nul 字符由 sprintf
自动附加。
您也可以避免使用 sprintf()
并像这样制作更高效的函数
void
hash2digest(char *result, const char *const hash, size_t length)
{
const char *characters = "0123456789abcdef";
for (size_t i = 0 ; i < length ; ++i)
{
result[2 * i] = characters[(hash[i] >> 0x04) & 0x0F];
result[2 * i + 1] = characters[hash[i] & 0x0F];
}
result[2 * length] = '[=10=]';
}
请注意,您可以像这样从任何地方调用它(假设 hash
已经声明和定义)
char digest[65];
hash2digest(digest, hash, 32);
这又可以重复用于 SHA1
例如,像这样
char digest[41];
hash2digest(digest, hash, 20);
并使用动态内存分配
char *
hash2digest(const char *const hash, size_t length)
{
const char *characters = "0123456789abcdef";
char *result;
result = malloc(2 * length + 1);
if (result == NULL)
return NULL;
for (size_t i = 0 ; i < length ; ++i)
{
result[2 * i] = characters[(hash[i] >> 0x04) & 0x0F];
result[2 * i + 1] = characters[hash[i] & 0x0F];
}
result[2 * length] = '[=13=]';
return result;
}
在加密函数 (sha256) 中,我有用于打印最终结果的代码:
void print_hash(unsigned char hash[])
{
int idx;
for (idx=0; idx < 32; idx++)
printf("%02x",hash[idx]);
printf("\n");
}
当函数中的 hash enter 是这样的:
/A�`�}#.�O0�T����@�}N�?�#=\&@
然后,通过循环,我在控制台中输入了这个
182f419060f17d2319132eb94f30b7548d81c0c740977d044ef1edbb9b97233d
我想知道如何将控制台中的最终值存储在变量中。 我已经阅读了一些关于 sscanf 的内容,但是你能帮我吗?
您可以使用 sprintf
:
void print_hash(unsigned char hash[], unsigned char output[])
{
int idx;
for (idx = 0; idx < 32; idx++)
sprintf(&output[2 * idx], "%02x", hash[idx]);
}
一定要为output
(即char output[2 * 32 + 1]
)中的空终止符保留一个额外的字节。
使用sprintf
,此函数将其输出(相当于printf
写入控制台的内容)存储在字符串缓冲区中。如何在您的案例中使用它的示例:
char buffer[65]; //Make this buffer large enough for the string and a nul terminator
for(int idx = 0; idx < 32; ++idx)
{
sprintf(&buffer[2*idx], "%02x", hash[idx]); //Write to the correct position in the buffer
}
终止 nul 字符由 sprintf
自动附加。
您也可以避免使用 sprintf()
并像这样制作更高效的函数
void
hash2digest(char *result, const char *const hash, size_t length)
{
const char *characters = "0123456789abcdef";
for (size_t i = 0 ; i < length ; ++i)
{
result[2 * i] = characters[(hash[i] >> 0x04) & 0x0F];
result[2 * i + 1] = characters[hash[i] & 0x0F];
}
result[2 * length] = '[=10=]';
}
请注意,您可以像这样从任何地方调用它(假设 hash
已经声明和定义)
char digest[65];
hash2digest(digest, hash, 32);
这又可以重复用于 SHA1
例如,像这样
char digest[41];
hash2digest(digest, hash, 20);
并使用动态内存分配
char *
hash2digest(const char *const hash, size_t length)
{
const char *characters = "0123456789abcdef";
char *result;
result = malloc(2 * length + 1);
if (result == NULL)
return NULL;
for (size_t i = 0 ; i < length ; ++i)
{
result[2 * i] = characters[(hash[i] >> 0x04) & 0x0F];
result[2 * i + 1] = characters[hash[i] & 0x0F];
}
result[2 * length] = '[=13=]';
return result;
}