使用PythonCType时,在匹配指针数组和数组的类型时出错,数组是C库函数的参数

使用PythonCType时,在匹配指针数组和数组的类型时出错,数组是C库函数的参数,python,c,dll,md5,ctypes,Python,C,Dll,Md5,Ctypes,检查PC上Python生成的哈希值和主板生成的哈希值是否与我正在使用的嵌入式主板的md5.c文件匹配时出现以下错误 TypeError:byref()参数必须是ctypes实例,而不是“list” OSError:异常:访问冲突读取0x033D2000 import os from ctypes import * import subprocess class MD5_CTX(Structure): _pack_ = 1 _fields_ = [("i",

检查PC上Python生成的哈希值和主板生成的哈希值是否与我正在使用的嵌入式主板的md5.c文件匹配时出现以下错误

TypeError:byref()参数必须是ctypes实例,而不是“list” OSError:异常:访问冲突读取0x033D2000

import os
from ctypes import *
import subprocess

class MD5_CTX(Structure):
    _pack_ = 1
    _fields_ = [("i", c_int * 2),
                ("buf", c_int * 4),
                ("in", c_short * 64),
                ("digest", c_short * 16)]
current_machine_id = subprocess.check_output('wmic csproduct get uuid').decode().split('\n')[1].strip()

current_machine_id = current_machine_id.replace('-','')
print(current_machine_id)

Hash = create_string_buffer(16)

Init_read_byte = CDLL('md5lib').MD5Init
Init_read_byte.argtypes = [POINTER(MD5_CTX)]

Update_read_byte = CDLL('md5lib').MD5Update
Update_read_byte.argtypes = [POINTER(MD5_CTX),POINTER(c_short),c_int]

Final_read_byte = CDLL('md5lib').MD5Update
Final_read_byte.argtypes = [c_char_p, POINTER(MD5_CTX)]

context = MD5_CTX()
Init_read_byte(byref(context))
#Update_read_byte(byref(context), byref(current_machine_id), 16)  !! First Error
Final_read_byte(Hash, byref(context))      !! Second Error

print(sizeof(Hash), repr(Hash.raw))

结果值如下所示:

123456789ABCDEF123456789ABCDEFFF (example)
First Error : TypeError: byref() argument must be a ctypes instance, not 'str'
Second Error : OSError: exception: access violation reading 0x03BB1000
下面是md5.c文件的函数

typedef unsigned int u32_t;
/* Data structure for MD5 (Message-Digest) computation */
typedef struct
{
    u32_t i[2];               /* number of _bits_ handled mod 2^64 */
    u32_t buf[4];             /* scratch buffer */
    unsigned short in[64];     /* input buffer */
    unsigned short digest[16]; /* actual digest after MD5Final call */
}MD5_CTX;

__declspec(dllexport) void
MD5Init(MD5_CTX *mdContext)
{
    mdContext->i[0] = mdContext->i[1] = (u32_t)0;

    /* Load magic initialization constants. */
    mdContext->buf[0] = (u32_t)0x67452301UL;
    mdContext->buf[1] = (u32_t)0xefcdab89UL;
    mdContext->buf[2] = (u32_t)0x98badcfeUL;
    mdContext->buf[3] = (u32_t)0x10325476UL;
}

__declspec(dllexport) void
MD5Update(MD5_CTX *mdContext, unsigned short *inBuf, unsigned short inLen)
{
    u32_t in[16];
    short mdi;
    unsigned short i, ii;

    /* compute number of bytes mod 64 */
    mdi = (short)((mdContext->i[0] >> 3) & 0x3F);

    /* update number of bits */
    if ((mdContext->i[0] + ((u32_t)inLen << 3)) < mdContext->i[0])
    {
        mdContext->i[1]++;
    }
    mdContext->i[0] += ((u32_t)inLen << 3);
    mdContext->i[1] += ((u32_t)inLen >> 29);

    while (inLen--)
    {
        /* add new character to buffer, increment mdi */
        mdContext->in[mdi++] = *inBuf++;

        /* transform if necessary */
        if (mdi == 0x40)
        {
            for (i = 0, ii = 0; i < 16; i++, ii += 4)
            {
                in[i] = (((u32_t)mdContext->in[ii + 3]) << 24) |
                    (((u32_t)mdContext->in[ii + 2]) << 16) |
                    (((u32_t)mdContext->in[ii + 1]) << 8) |
                    ((u32_t)mdContext->in[ii]);
            }
            Transform(mdContext->buf, in);
            mdi = 0;
        }
    }
}

__declspec(dllexport) void 
MD5Final(unsigned short hash[], MD5_CTX *mdContext)
{
    u32_t in[16];
    short mdi;
    unsigned short i, ii;
    unsigned short padLen;

    /* save number of bits */
    in[14] = mdContext->i[0];
    in[15] = mdContext->i[1];

    /* compute number of bytes mod 64 */
    mdi = (short)((mdContext->i[0] >> 3) & 0x3F);

    /* pad out to 56 mod 64 */
    padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
    MD5Update(mdContext, PADDING, padLen);

    /* append length in bits and transform */
    for (i = 0, ii = 0; i < 14; i++, ii += 4)
    {
        in[i] = (((u32_t)mdContext->in[ii + 3]) << 24) |
            (((u32_t)mdContext->in[ii + 2]) << 16) |
            (((u32_t)mdContext->in[ii + 1]) << 8) |
            ((u32_t)mdContext->in[ii]);
    }
    Transform(mdContext->buf, in);

    /* store buffer in digest */
    for (i = 0, ii = 0; i < 4; i++, ii += 4)
    {
        mdContext->digest[ii] = (unsigned short)(mdContext->buf[i] & 0xFF);
        mdContext->digest[ii + 1] =
            (unsigned short)((mdContext->buf[i] >> 8) & 0xFF);
        mdContext->digest[ii + 2] =
            (unsigned short)((mdContext->buf[i] >> 16) & 0xFF);
        mdContext->digest[ii + 3] =
            (unsigned short)((mdContext->buf[i] >> 24) & 0xFF);
    }
    memcpy(hash, mdContext->digest, 32);
}
typedef无符号整数u32\t;
/*MD5(消息摘要)计算的数据结构*/
类型定义结构
{
u32_t i[2];/*已处理的_位数mod 2^64*/
u32_t buf[4];/*划痕缓冲区*/
[64];/*输入缓冲区中的无符号短字符*/
MD5Final调用后的未签名短摘要[16];/*实际摘要*/
}MD5_-CTX;
__declspec(dllexport)无效
MD5Init(MD5_CTX*mdContext)
{
mdContext->i[0]=mdContext->i[1]=(u32_t)0;
/*加载魔术初始化常量*/
mdContext->buf[0]=(u32_t)0x67452301UL;
mdContext->buf[1]=(u32_t)0xefcdab89UL;
mdContext->buf[2]=(u32_t)0x98badcfell;
mdContext->buf[3]=(u32_t)0x10325476UL;
}
__declspec(dllexport)无效
MD5Update(MD5_CTX*mdContext,无符号短*inBuf,无符号短内联)
{
u32_t in[16];
短mdi;
无符号短i、ii;
/*计算字节数mod 64*/
mdi=(短)((mdContext->i[0]>>3)和0x3F);
/*更新位数*/
if((mdContext->i[0]+((u32_t)inLen i[0])
{
mdContext->i[1]++;
}
mdContext->i[0]+=((u32_t)inLen i[1]+=((u32_t)inLen>>29);
而(inLen--)
{
/*向缓冲区添加新字符,递增mdi*/
mdContext->in[mdi++]=*inBuf++;
/*必要时进行变换*/
如果(mdi==0x40)
{
对于(i=0,ii=0;i<16;i++,ii++=4)
{
[i]=((u32_t)mdContext->in[ii+3])in[ii+2])in[ii+1])in[ii]);
}
转换(mdContext->buf,in);
mdi=0;
}
}
}
__declspec(dllexport)无效
MD5Final(无符号短哈希[],MD5_CTX*mdContext)
{
u32_t in[16];
短mdi;
无符号短i、ii;
无符号短padLen;
/*保存位数*/
在[14]=mdContext->i[0]中;
in[15]=mdContext->i[1];
/*计算字节数mod 64*/
mdi=(短)((mdContext->i[0]>>3)和0x3F);
/*将键盘输出到56 mod 64*/
帕德伦=(mdi<56)?(56-mdi):(120-mdi);
MD5Update(mdContext、PADDING、padLen);
/*以位和变换形式追加长度*/
对于(i=0,ii=0;i<14;i++,ii++=4)
{
[i]=((u32_t)mdContext->in[ii+3])in[ii+2])in[ii+1])in[ii]);
}
转换(mdContext->buf,in);
/*在摘要中存储缓冲区*/
对于(i=0,ii=0;i<4;i++,ii++=4)
{
mdContext->digest[ii]=(无符号短)(mdContext->buf[i]&0xFF);
mdContext->digest[ii+1]=
(无符号短)((mdContext->buf[i]>>8)和0xFF);
mdContext->摘要[ii+2]=
(无符号短)((mdContext->buf[i]>>16)和0xFF);
mdContext->摘要[ii+3]=
(无符号短)((mdContext->buf[i]>>24)和0xFF);
}
memcpy(hash,mdContext->digest,32);
}
我想用C语言打印的内容如下

INT8U ID[16] = {0, };
INT8U Hash[16] = {0, };
MD5_CTX context;

MD5Init(&context);
MD5Update(&context, ID, 16); // current machine id instead of ID
MD5Final(Hash, &context);

for (i = 0; i < 16; i++)
   printf ("%02x", Hash[i]);
printf("\n");
int8uid[16]={0,};
INT8U散列[16]={0,};
MD5_CTX上下文;
MD5Init(和上下文);
MD5Update(&context,ID,16);//当前计算机id而不是id
MD5Final(哈希和上下文);
对于(i=0;i<16;i++)
printf(“%02x”,散列[i]);
printf(“\n”);
我一直在尝试匹配MD5Update和MD5Final的参数,但我不熟悉python,所以问了一个问题


如果您能帮助我,谢谢您。

请发布错误的完整回溯。还有错误:
Final\u read\u byte=CDLL('md5lib')。MD5Update
应该使用
MD5Final
。C代码显示
INT8U散列[16]
但是
MD5Final
采用
无符号短散列[]
。这是不一致的。Python使用了一个
create\u string\u缓冲区(16)
,它与
INT8U
一致,但与函数签名不一致。