最初我想将此uint8_t
数组转换为c中的char
数组。我试图解决这个问题有点困难。我的第一个替代解决方案是将另一个类型值复制到临时值,将tmp值复制到可写char,然后从内存中删除tmp值。顺便说一句,这用于伴随blake哈希函数。这是我的代码片段:
char * bl(char *input)
{
uint8_t output[64];
char msg[]= "";
char *tmp;
int dInt;
memset(output,0,64);
tmp = (char*) malloc(64);
if (!tmp){
exit( 1);
}
dInt = strlen(input);
if (dInt > 0xffff){
exit( 1);
}
uint8_t data[dInt];
memset(data,0, dInt);
strlcpy(data,input,dInt);
uint64_t dLen =dInt;
blake512_hash(output, data,dLen);
int k;
for (k=0;k<64;k++){
tmp[k] = output[k]; //does this "copy" is buggy code?
}
memcpy(msg, tmp,64);
//so here I can to delete tmp value
// I dont want there were left unused value in memory
// delete tmp;
free(tmp);
return msg;
}
我认为上面的代码效率仍然不高,您有什么看法,提示和修正? 非常感谢你!
答案 0 :(得分:5)
首先,你永远不应该返回一个指向局部变量的指针,因为变量将在函数退出时被销毁。您可能希望将输出数组传递给bl
函数并使用它来输出字符串。
对于大多数情况(如果uint8_t是char,通常就是这种情况),memcpy(msg, output, 64)
就足够了。如果你想严格要求它(坦率地说blake512_hash
如果期望uint8_t
数组一直作为输出,那么首先不应该返回char
数组,你可以只需在for循环中调用msg[k] = (char)tmp[k]
,然后移除memcpy
。
答案 1 :(得分:0)
这里有点不对。
dInt = strlen(input) + 1; // dInt is the size of the string including the terminating '\0'.
strlcpy
确实使用的是大小,而不是strlen。
msg = tmp;并没有释放tmp。因为msg是const char *&#34;&#34; (用C ++术语表示)。