Преобразование массива char в int с помощью strtol() в C

У меня проблемы с функцией strtol () в C, вот фрагмент кода того, как я пытаюсь использовать его

char   TempChar;                        
char   SerialBuffer[21];
char   hexVoltage[2];
long   intVoltage;

 do
   {
     Status = ReadFile(hComm, &TempChar, sizeof(TempChar), &NoBytesRead, NULL);
     SerialBuffer[i] = TempChar;
     i++;
    }
  while (NoBytesRead > 0);

memcpy(hexVoltage, SerialBuffer+3, 2);

intVoltage = strtol(hexVoltage, NULL, 16);

Итак, вопрос в том, почему strtol () возвращает 0? И как мне преобразовать массив значений char в шестнадцатеричном формате в int (long в данном конкретном случае)? hexVoltage в моем случае содержит {03, 34} после memcpy(). Заранее спасибо. Очень ценю помощь здесь.

1 ответ

Решение

strtol и друзья ожидают, что вы предоставите им печатное представление числа в формате ASCII. Вместо этого вы предоставляете ему двоичную последовательность, которая читается из файла (порта).

В этом случае ваш intVoltage может быть вычислено путем объединения двух байтов чтения в 2-байтовое число с побитовыми операциями, в зависимости от порядка следования этих чисел на вашей платформе:

uint8_t binVoltage[2];
...
uint16_t intVoltage = binVoltage[0] | (binVoltage[1] << 8);
/* or */
uint16_t intVoltage = (binVoltage[0] << 8) | binVoltage[1];
Другие вопросы по тегам