Заменить uint8_t * на char *? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть API, который запрашивает char*, это моя функция API:

CANMessage(unsigned _id,  const char* _data, char _len = 8)

Более подробная информация доступна здесь: https://os.mbed.com/docs/mbed-os/v5.11/mbed-os-api-doxy/classmbed_1_1_c_a_n_message.html

Я бы хотел вызвать эту функцию из другой функции, но я запутался в const char* и касте. Я хочу вызвать эту функцию из функции foo(), вот так:

void foo(unsigned int id, /*???*/ data, char len) {
    CANMessage(id, data, len)
}

Так что мне нужно передать id, data и len в функцию foo. Моя проблема в том, что входящий data имеет тип uint8_t. Я получил вектор uint8_t, где адрес первого элемента - это тот, который мне нужно передать:

vector<uint8_t> dta;

Который я пытался передать как &dta[0]: foo(idNo, &dta[0], length)

С функцией foo следующим образом:

void foo(unsigned int id, uint8_t* data, char len) {
    CANMessage(id, (char*)data, len)
}

Но я получаю "Аргумент типа std :: uint8_t * несовместим с параметром типа char *

Как передать его как const char*, когда функция foo, которая его вызывает, принимает uint8_t*?

Обратите внимание, я не могу изменить типы, dta должна остаться vector<uint8_t>.

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

std::uint8_t равно unsigned char.

Это отличается от обычного или подписанного символа, но все они 8-битные, поэтому приведение будет работать технически.

ЭтоОбщеизвестно, что многие функции, которым в противном случае понадобился бы «буфер», имеют char* в своем определении вместо правильного unsigned char*.Поэтому приведение, скорее всего, будет безвредным.

В случае, если функция на самом деле хочет символы, а не буфер, у вас возникнет проблема, потому что типы разные, и возникнет ли у вас проблема или нет.не определено.

1 голос
/ 15 мая 2019

Поскольку вы находитесь в среде, где доступно std::uint8_t, типы char должны быть не более 8 бит, но просто для того, чтобы убедиться, что вы не работаете на машине с 7-битными символами, добавьте static_assert.

reinterpret_cast от uint8_t* до const char* и static_cast размер (size_t) вектора до char.

void foo(unsigned _id, const std::vector<uint8_t>& dta) {
    static_assert(CHAR_BIT == 8, "Strange char");

    CANMessage(
        _id,
        reinterpret_cast<const char*>(dta.data()),
        static_cast<char>(dta.size())
    );
}
...