Nano Hash - криптовалюты, майнинг, программирование

Как создать эквивалентную структуру в python и использовать malloc для изменения ссылки нулевого указателя

Я «перевожу» код с С++ на python, используя ctypes. Обычно я бы не сидел и не переводил код с C++ на Python, но проект, над которым я работаю, требует этого.

Исходный код C++ имеет структуру, отформатированную следующим образом;

typedef struct {
        ViChar resourceString[256];
    }BP2_DEVICE;

В основном коде указатель был инициализирован следующим образом;

BP2_DEVICE* resStr = 0;

Затем выделяется память;

resStr = (BP2_DEVICE *)malloc(256);

При поиске помощи в Интернете я прочитал, что создание класса для представления структуры BP2_Device будет работать;

class BP2_Device:
    def __init__(self, resourceString):
        self.resourceString = resourceString

Хотя я не уверен, как бы я включил тот факт, что 'resourceString' должен быть изменяемым массивом. Я знаю, что код для преобразования resourceString в изменяемый массив будет следующим:

resourceString = ct.create_string_buffer(256)

Что касается того, как заставить его работать со структурой/классом, я не знаю.

Я также просмотрел этот вопрос для справки с malloc, но их настройки не совсем такие, как у меня.

Общий код довольно длинный, и я не хочу перегружать им вопрос. Если есть что-то, что мне нужно добавить, чтобы уточнить, пожалуйста, дайте мне знать. Любая помощь приветствуется, спасибо.

10.07.2019

  • Выделение четырех байтов для чего-то, что явно имеет длину не менее 256 байт, ничем хорошим не закончится. 10.07.2019
  • Похоже, они пытаются (и терпят неудачу) построить массив с изменяемым размером. Если это так, вы можете просто использовать обычный старый список, кортеж, строку или что-то еще, что имеет смысл. 10.07.2019
  • Если вы переводите код C++ на Python, зачем вам ctypes? Обычно он используется для взаимодействия с C API. При переводе на чистый Python все, что вам нужно, это bytearray(256). 10.07.2019
  • Каким бы ни было содержимое структуры, в 64bit у вас будет неопределенное поведение (из-за malloc(4)). 10.07.2019
  • @SamVarshavchik Это была опечатка с моей стороны, я хотел поставить 256 вместо 4. 10.07.2019
  • @MarkTolonen По сути, я использую программу C++, которую я перевожу, в качестве шаблона того, как использовать некоторые функции, определенные в общей библиотеке (dll). Мне нужны ctypes, потому что я получаю доступ к функциям из dll через python и использую существующую программу C++ в качестве примера/руководства. 10.07.2019

Ответы:


1

Это зависит от того, как вы хотите использовать структуру, но если resourceString является строкой с завершающим нулем, это работает:

from ctypes import *

class Bp2Device(Structure):
    _fields_ = [('resourceString',c_char * 256)]

dev = Bp2Device(b'some resource string')
print(dev.resourceString)
dev.resourceString = b'x' * 256 #works
dev.resourceString = b'x' * 257 #fails

Выход:

b'some resource string'
Traceback (most recent call last):
  File "C:\test.py", line 9, in <module>
    dev.resourceString = b'x' * 257
ValueError: bytes too long (257, maximum length 256)

Обратите внимание, что resourceString — это буфер с возможностью записи, поэтому вы можете передать эту структуру функциям C DLL, и они смогут безопасно записывать в нее. ctypes специально обрабатывает массивы c_char * n и отображает их как bytes, но вы не можете индивидуально присваивать значения элементам массива из-за этой специальной обработки. Если вам нужны записываемые элементы, используйте c_ubyte * 256, но тогда вы не сможете инициализировать массив напрямую строками байтов. Пример:

from ctypes import *

BYTEARRAY256 = c_ubyte*256

class Bp2Device(Structure):
    _fields_ = [('resourceString',BYTEARRAY256)]

b = BYTEARRAY256(*list(b'abcdefg'))
dev = Bp2Device(b)
dev.resourceString[6] = ord('x')
print(bytes(dev.resourceString))

Выход:

b'abcdefx\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
10.07.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..