0

文字列の値を返すことができる関数を作りたいです。しかし、私はこの間違いだけでは解決できない数日でこの問題に遭遇しました。だから私はあなたのアドバイスやヒントが必要です。Hash jh sha3 2010候補関数を使用していました。コードは次のとおりです。

anyway this an update code, but I still dont get expected value to get this function called from Python Language. the returned value is "9976864". Anymore helps?

#include <stdio.h>
#include "jh_ansi_opt32.h"
#include <time.h>
#include <stdlib.h>

char* jh(char *input)
{
BitSequence  output[512];
char *iData; 
char* msg;

int dInt;

msg= (char*)malloc(sizeof(output));
if(!msg){
    return 1;
}

memset(output,0,sizeof(output));

iData = input;
printf("[+] data is %s\n", iData);
dInt = strlen(iData);
BitSequence data[dInt];

memset(data,0, sizeof(data));
strncpy(data,iData,dInt);
DataLength dLen =dInt;
HashJh(512, data,dLen,output);
//printf("\n[+] resulted hash is ");

int k;
for (k=0;k<sizeof(output);k++){
        msg[k]= output[k];
}
if (msg) return msg;
free(msg);
return 0;
}

そしてpythonのものは次のとおりです。

from ctypes import *
d = CDLL('jh.dll')
a=d.jh('this is message by hash jh function')
print a

これは更新コードですが、まだ期待値が得られません。Python から呼び出そうとしたときに返される値は、整数 "9968784" です。もう助けていただければ幸いです、ありがとう..

4

4 に答える 4

1
if (!(BitSequence *)malloc(sizeof(output)))
    exit(EXIT_FAILURE);

それは何もしません。次に、インクリメントmsgしてから返します。第三に、あなたは決して逆参照しているようには見えません、あなたはそれを増やしているだけです。msg

于 2012-04-06T22:45:02.830 に答える
0

mallocコードを削除するoutputと、、、、dataおよびdLen配列/変数がスタックに割り当てられます。

msgは、char*ではありませんchar。また、初期化されていません。

文字列を返したい場合は、を使用してその文字列を割り当てmalloc、何らかの方法で入力する必要があります。文字列のポインタを返します。

于 2012-04-06T22:47:02.223 に答える
0

これは、malloc によって返されたポインタを失うか、メモリがなくなった場合にのみ機能します。

if (!(BitSequence *)malloc(sizeof(output)))
        exit(EXIT_FAILURE);

次に、これは同じことを行います:

if ((BitSequence *) malloc(sizeof(data)) == NULL)
    exit(EXIT_FAILURE);

それはあなたが必要とするものですか?私は通常、それはバグだと言います。

于 2012-04-06T22:50:06.860 に答える
0

Python の戻り値の問題に関しては、ctypesデフォルトでは整数の戻り値が期待されます。戻り値の型を伝えます ( docs ):

>>> from ctypes import *
>>> d = CDLL('jh.dll')
>>> d.jh('abc')
39727048
>>> d.jh.restype=c_char_p
>>> dll.jh('abc')
'abc'

私はあなたの DLL を偽造し、文字列を返しました。取得する数値は、返されるポインター アドレスの整数値です。

他の人が言及しているように、解放する方法がないmallocされたポインタを返すメモリがリークすることに注意してください。

于 2012-04-07T01:39:01.050 に答える