2

uint8_t最初に、この配列をcharcの配列に変換したいと思います。私はこの問題を解決しようとして少し立ち往生しています。私の最初の代替ソリューションは、別の型の値を一時的な値にコピーし、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;
}

上記のコードはまだ効率的ではないと思います。あなたの意見、ヒント、および修正は何ですか? 以前はありがとうございました!

4

2 に答える 2

6

まず第一に、変数は関数が終了するまでに破棄されるため、ローカル変数へのポインタを返すべきではありません。おそらく、出力配列をbl関数に渡し、それを使用して文字列を出力する必要があります。

ほとんどの場合 (通常は uint8_t IS char の場合)、これmemcpy(msg, output, 64)で十分です。それについて厳密にしたい場合(常に出力として配列を期待している場合、率直に言って、そもそも配列をblake512_hash返すべきではありません)、 for ループを呼び出して remove するだけです。uint8_tcharmsg[k] = (char)tmp[k]memcpy

于 2012-04-18T02:18:40.097 に答える
0

ここでは少し間違っています。

dInt = strlen(input) + 1; // dInt is the size of the string including the terminating '\0'.

strlcpy確かに、strlenではなくサイズを使用します。

メッセージ = tmp; tmpを解放しません。msg は const char* "" であるため (C++ 用語で)。

于 2012-04-18T02:23:36.467 に答える