Как распаковать Cython memoryview - PullRequest
0 голосов
/ 05 мая 2019

У меня есть представление памяти 32-битных беззнаковых целых, которые я хотел бы распаковать в некоторые символы, целые и строки (или массивы символов при необходимости).

cdef const unsigned int[:] bin_file = np.fromfile(rom_fd, dtype='<u4')

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

Я хочу распаковать эти байты из памяти (или памяти: bin_file[:48])

Легко получить int из памяти:

cdef unsigned int first_int = bin_file[0]

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

Я бы хотел использовать что-то похожее на

cdef char[12] my_string = bin_file[40:43]

но это просто выдает ошибку, говорящую «Невозможно назначить тип« const unsigned int [:] »для« char [12] »».

1 Ответ

0 голосов
/ 07 мая 2019

Я думаю, что лучший способ - использовать функцию numpy ndarray.view для просмотра массива как другого типа.Вы не получите никакого ускорения от Cython (поскольку вы просто используете неповоротливые функции), но большинство способов, которые я могу себе представить, делают это в Cython, как будто они могут быстро привести к возможным бедствиям.

cdef char[::1] my_string = np.asarray(bin_file[40:43]).view(dtype=np.uint8)

Обратите внимание, что я указал, что my_string и bin_file (не показаны) являются смежными с использованием синтаксиса ::1.Если это не так, то ваша попытка просмотреть их как другой тип памяти не сработает.

...