Как преобразовать шестнадцатеричную строку в байтовый массив в CAPL? - PullRequest
0 голосов
/ 15 ноября 2018

Учитывая наличие, например, этого типа шестнадцатеричной строки:

char hex_str[100] = "0x01 0x03 0x04 0x0A";

Как получить из этой строки представление байтового массива в CAPL, например:

byte hex_str_as_byte_arr[4] = {0x01, 0x03, 0x04, 0x0A};

РЕДАКТИРОВАТЬ: Разрешены только поддерживаемые Vector CANoe типы данных / функции!

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Мы можем использовать sscanf() для преобразования чисел в unsigned char.В цикле нам нужно также использовать преобразование %n, чтобы определить позицию чтения для следующей итерации.

Вот простой пример (в реальной жизни вам потребуется некоторая проверка диапазона, чтобы сделатьуверен, что вы не переполните выходной буфер):

#include <stdio.h>

int main(void)
{
    const char hex_str[100] = "0x01, 0x03, 0x04, 0x0A";
    unsigned char bytes[4];

    {
        int position;
        unsigned char *b = bytes;

        for (const char *input = hex_str;  sscanf(input, "%hhi, %n", b, &position) == 1;  ++b) {
            input += position;
        }
    }

    /* prove we did it */
    for (size_t i = 0;  i < sizeof bytes;  ++i) {
        printf("%hhu ", bytes[i]);
    }
    puts("");
}
0 голосов
/ 15 ноября 2018

Спасибо всем ... На самом деле я сам нашел решение:

  char hex_str[100] = "0x01 0x03 0x04 0x0A";
  long data[4];
  dword pos = 0;

  pos = strtol(hex_str, pos, data[0]);
  pos = strtol(hex_str, pos, data[1]);
  pos = strtol(hex_str, pos, data[2]);
  pos = strtol(hex_str, pos, data[3]);

  write("0x%02x,0x%02x,0x%02x, 0x%02x", data[0], data[1], data[2], data[3]);

Теперь это простой актерский состав: (byte) data[0]

0 голосов
/ 15 ноября 2018

Используйте strtok, чтобы разбить массив символов на отдельные шестнадцатеричные строки, затем используйте long strtol( const char *restrict str, char **restrict str_end, int base ), чтобы преобразовать каждую шестнадцатеричную строку в целочисленное значение.

...