Дана 24-битная строка, включенная в три 8-битных регистра, скажем: массив [0], массив [1], массив [2], где первый бит массива [0] — старший бит, а последний бит массива [2] — младший бит. . Моя цель - преобразовать эту строку в целочисленное значение.

Для этой цели я написал следующий код:

uint32_t bin2Int(uint8_t array[]) {
    uint8_t arr0[3];
    uint8_t mask = 0x80;
    uint8_t outputData[24];
    uint8_t s;
    uint8_t k = 23;
    uint32_t IntResult = 0;
    for (s=0; s<3; s++) {
      arr0[s] = *array[s];
      while (mask > 0) {
          outputData[k] = arr0[s] & mask;
          mask >>= 1;
          k--;
      }
      mask = 0x80;
    }
    for (s=0; s<24; s++) {
      if(outputData[s] != 0)
          IntResult += pow(2, s);
    }
    return IntResult;
}

Эта функция реализована в STM32CubeIde, когда я собираю проект, компилятор возвращает следующую ошибку: «недопустимый аргумент типа унарного '*' (есть 'int')». Прежде чем добавить этот код в свой проект, я протестировал его в DevC ide, и он отлично работает, но когда я пробую его на STM32CubeIde, он возвращает эту ошибку. Что не так в моем коде? Большое спасибо.

0
Idix 23 Янв 2023 в 21:57
3
array[s] является целым числом, почему вы пытаетесь разыменовать его с помощью *array[s]?
 – 
Barmar
23 Янв 2023 в 21:58
Судя по вашему описанию, байты массива организованы как big endian. И каждый байт имеет биты с обратным порядком байтов. Таким образом, не требуется никакого сдвига/инвертирования битов внутри байта. AFAICT, код может быть намного проще: uint32_t bin2Int(uint8_t array[]) { uint32_t ret = 0; for (int s = 0; s < 3; ++s) { ret <<= 8; ret |= array[s]; } return ret; }
 – 
Craig Estey
23 Янв 2023 в 22:09

2 ответа

В этом заявлении

arr0[s] = *array[s];

Правостороннее выражение имеет тип указателя uint8_t *, а левостороннее выражение имеет тип uint8_t.

Кажется ты имеешь ввиду

arr0[s] = array[s];

И функция должна быть объявлена как минимум

uint32_t bin2Int( const uint8_t array[]);

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

uint32_t bin2Int( const uint8_t array[], size_t n );

И используйте переменную n вместо магического числа 3.

0
Vlad from Moscow 23 Янв 2023 в 22:07

В принципе, эта функция ужасна.

Поскольку вы используете STMCubeIDE, я предполагаю, что это для STM32 uC.

MSB находится в индексе 0:

uint32_t bin24ToInt(const uint8_t *array)
{
    return ((uint32_t)array[0] << 16) | ((uint32_t)array[1] << 8) | array[2];
}

Если биты расположены в порядке, противоположном обычному: (используя встроенные функции ARM CMSIS.

uint32_t bin24ToIntReverseBitOrder(const uint8_t *array)
{
    return (__RBIT(array[0]) >> 8) | (__RBIT(array[1]) >> 16) | (__RBIT(array[2]) >> 24);
}
0
0___________ 23 Янв 2023 в 22:17