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;
}

而蟒蛇是:

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

关于 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 回答
0

摆脱malloc代码,您的output,datadLen数组/变量将在堆栈上分配。

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 回答