如何将数组转换为char,以便我可以从c中的函数返回此char值。然后,用Python调用它。

时间:2012-04-06 22:42:53

标签: python c hash ctypes

我想创建函数,可以返回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”。我们将不胜感激,谢谢......

4 个答案:

答案 0 :(得分:1)

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

这没有做任何事情。其次,您正在递增msg然后返回它。第三,你似乎永远不会取消引用msg,你只是递增它。

答案 1 :(得分:0)

删除malloc代码,您的outputdatadLen数组/变量将在堆栈中分配。

msgchar*,而不是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指针而无法释放它。