我想创建函数,可以返回string的值。但是我在几天内无法解决这个问题,偶然发现了这个问题。所以我需要你的建议和提示。我正在使用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”。我们将不胜感激,谢谢......
答案 0 :(得分:1)
if (!(BitSequence *)malloc(sizeof(output))) exit(EXIT_FAILURE);
这没有做任何事情。其次,您正在递增msg
和然后返回它。第三,你似乎永远不会取消引用msg
,你只是递增它。
答案 1 :(得分:0)
删除malloc
代码,您的output
,data
和dLen
数组/变量将在堆栈中分配。
msg
是char*
,而不是char
。它也是未初始化的。
如果要返回字符串,则需要使用malloc
进行分配并以某种方式填写。返回指向字符串的指针。
答案 2 :(得分:0)
这会丢失malloc返回的指针,或者仅在没有更多内存时才会起作用:
if (!(BitSequence *)malloc(sizeof(output)))
exit(EXIT_FAILURE);
然后这样做:
if ((BitSequence *) malloc(sizeof(data)) == NULL)
exit(EXIT_FAILURE);
这就是你需要的吗?我通常会说这是一个错误。
答案 3 :(得分: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指针而无法释放它。