Каков наилучший способ передачи буфера uint8_t * и size_t bufferlen в функцию API в C из C ++ - PullRequest
1 голос
/ 01 ноября 2019

API функции AC принимает uint8_t * и size_t в качестве параметров:

bool foo(uint8_t* buff, size_t bufflen)

Каков наилучший способ управления и обработки на уровне C ++, вызывающий этот API. Является ли строка, вектор или список лучшим вариантом

Ответы [ 5 ]

3 голосов
/ 01 ноября 2019

Просто убедитесь, что при вызове этого API из C ++ вы всегда передаете указатель типа uint8_t. нормальный массив uint8_t arr[x] (x - любое + ve число) также будет работать. Просто убедитесь, что переданный адрес содержит данные типа uint8_t с правильным размером буфера.

например uint8_t arr[6]; для этого звонка будет foo(arr,6);

2 голосов
/ 01 ноября 2019

Вы не можете передать контейнер функции C. Вы все еще можете использовать его в своем коде C ++, но вам нужно будет передать указатель на данные в соответствии с параметрами функции C. Используйте вектор . Это эквивалентно массиву в C, в котором данные хранятся непрерывно в памяти.

std::vector<uint8_t> myData;
// ... fill myData
// for c++11 and later,
foo(myData.data(), myData.size());
// pre-c++11
foo(&(myData[0]), myData.size());
2 голосов
/ 01 ноября 2019

Вы, вероятно, хотите std::vector<uint8_t> при прохождении data() и size().

1 голос
/ 01 ноября 2019

Является ли строка, вектор или список лучшим вариантом?

Что ж, list - это не стартер, поскольку он не будет хранить последовательность в непрерывной памяти. Другими словами, код C не сможет взять указатель на первый элемент и увеличить его для перехода ко второму элементу.

Что касается двух других, это зависит от остальной части вашего кода C ++,Я бы склонялся к vector, а не string, но вы на самом деле не предоставили достаточно контекста, чтобы это было чем-то большим, чем общее чувство.

0 голосов
/ 01 ноября 2019

Обычно я хотел бы пойти с вспомогательным классом, у которого есть метод, который принимает либо вектор, либо пользовательскую структуру, которая действует как диапазон - то есть pair<void*,int>, или, возможно, даже диапазон (но мне не разрешаютC ++ 14 мелков).

Если данные действительно основаны на символах, то std :: string и string могут работать хорошо, но если это действительно двоичные данные, лучше использовать инкапсуляцию vector и vector, IMBO.

Я все еще не хочу вызывать это напрямую из кода приложения, если на самом деле есть структурированные данные. Вы можете легко написать метод, который принимает ожидаемый тип структуры и генерирует указатель и sizeof (instance).

Вы можете написать универсальный шаблон, который будет принимать любую структуру и преобразовывать ее в void * / char * и length, но это приведет к открытию вашего кода для большего количества аварий.

...