Я пытаюсь получить доступ к двум устаревшим функциям де / сжатия из Python, которые написаны на C и в настоящее время доступны через DLL (у меня есть источник C).
Функции передаются (частично) заполненной структуре C и используют эту информацию для сжатия или распаковки данных в предоставленном буфере.
Так называются функции. Я добавил __cdecl для совместимости с Python.
// Both functions return 0 on success and nonzero value on failure
int __cdecl pkimplode(struct pkstream *pStr);
int __cdecl pkexplode(struct pkstream *pStr);
Вот структура pkstream, как определено в C:
struct pkstream {
unsigned char *pInBuffer; // Pointer to input buffer
unsigned int nInSize; // Size of input buffer
unsigned char *pOutBuffer; // Pointer to output buffer
unsigned int nOutSize; // Size of output buffer upon return
unsigned char nLitSize; // Specifies fixed or var size literal bytes
unsigned char nDictSizeByte; // Dictionary size; either 1024, 2048, or 4096
// The rest of the members of this struct are used internally,
// so setting these values outside pkimplode or pkexplode has no effect
unsigned char *pInPos; // Current position in input buffer
unsigned char *pOutPos; // Current position in output buffer
unsigned char nBits; // Number of bits in bit buffer
unsigned long nBitBuffer; // Stores bits until enough to output a byte
unsigned char *pDictPos; // Position in dictionary
unsigned int nDictSize; // Maximum size of dictionary
unsigned int nCurDictSize; // Current size of dictionary
unsigned char Dict[0x1000]; // Sliding dictionary used for compdecomp
};
Это моя попытка отразить эту структуру в Python.
# Define the pkstream struct
class PKSTREAM(Structure):
_fields_ = [('pInBuffer', c_ubyte),
('nInSize', c_uint),
('pOutBuffer', c_ubyte),
('nOutSize', c_uint),
('nLitSize', c_ubyte),
('nDictSizeByte', c_ubyte),
('pInPos', c_ubyte),
('pOutPos', c_ubyte),
('nBits', c_ubyte),
('nBitBuffer', c_ulong),
('pDictPos', c_ubyte),
('nDictSize', c_uint),
('nCurDictSize', c_uint),
('Dict', c_ubyte)]
Я был бы очень признателен за помощь в решении следующих вопросов (которые я предпочитаю задавать на внешнем интерфейсе, а не просто «подгонять» его, надеюсь, по понятным причинам):
Я не уверен, использовать ли c_ubyte, c_char или c_char_p для членов типа unsigned char . c_ubyte наиболее точно отображается в ctypes для unsigned char (по крайней мере, в соответствии с документами), но на самом деле является? int / long? в Python.
Иногда элемент является указателем на неподписанный символ ... будет ли это сопоставляться с c_char_p? Документы ctypes говорят, что ВСЕ строки байтов и юникод в любом случае передаются как указатели, так что для этого мне нужно сделать?
Мне нужно предоставить функцию pOutBuffer, которая должна быть указателем на расположение выделенной памяти, в которую функция может копировать де / сжатые данные. Я считаю, что я должен использовать create_string_buffer (), чтобы создать буфер соответствующего размера для этого?
Мне также нужно знать, как определить член Dict [0x1000] , который ищет (для меня) создание 4096-байтового буфера для внутреннего использования в функциях. Я знаю, что мое определение явно неверно, но не знаю, как оно должно быть определено?
Должны ли функции C быть оформлены как __stdcall или __cdecl? (Я использовал последний в некоторых тестовых DLL, так как до этого момента работал).
Любая обратная связь будет очень признательна!
Заранее спасибо,
Джеймс