Вернуть шестнадцатеричные значения из C Dll в Python, используя ctypes - PullRequest
0 голосов
/ 24 мая 2018

У меня есть большой массив в файле, который я не могу изменить, но мне нужен доступ в C ++.Мне нужно перебрать массив и вернуть значение скрипту Python.

Проблема: я могу найти элемент в массиве по его имени.Когда я пытаюсь вернуть его значение и элементы section в оболочку Python, они возвращают 0 или -1 независимо от того, каково их действительное значение.Вот пример первого элемента в массиве из external_lists.h:

info_struct A1[] = {
{ "LIMITING", {{0x00, 0x02, 0xFF}}
 .........
    }

Этот массив имеет тысячи похожих элементов.Когда я запускаю следующий код, я получаю 0x или -0x1.Valuedll.cpp:

#include <iostream>
#include <string>
#include <array>
#include "external_lists.h"

extern info_struct A1[];
extern info_struct  A2[];
extern int A1size;
extern int A2size;

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int get_creation_data(const char* needed_name){

int A1_size = ( A1size/ sizeof(A1[0])) ;
int A2_size = ( A2size / sizeof(A2[0]))  ;

for (int i = 0; i < A1_size; i++) {
    if (A1[i].name == needed_name) { 
    return A1[i].style->value; 
    }
  }
    return -1;
}

Тип info_struct сделан из следующей структуры:

struct info_struct{
const char* name; 
style_length style[MAX_SIZE];
options_length options[MAX_SIZE];
}

Мне нужно получить значения, которые находятся в массиве стилей.Структура style_length имеет следующий вид:

struct style_length{
   uint16_t value, section;
   option_bits obits;
}

Моя оболочка Python выглядит следующим образом:

import os, sys, re
from ctypes import *
import ctypes as ct

def get_creation_values(value_name):
  valuell = CDLL('C:\\Documents\\creation.dll')
  valuell.get_section_data.argtypes = [c_char_p]
  valuell.get_section_data.restype = ct.c_int16
  return hex(valuell.get_creation_data(value_name))

if __name__ == "__main__":
  val = get_creation_values('LIMITING')
  print(val)

Вывод:

(-0x1)

Заранее благодарим за любую помощь.Если это слишком много, спасибо за чтение.Я постараюсь уточнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...