Преобразование строки в шестнадцатеричный формат, например 88, в 0x88.

Я использую gtk+. Как преобразовать строку в шестнадцатеричный формат, например char*p="88" в unsigned char s=0x88. Мне нужно присвоить строковое значение из таблицы байтовому элементу в массиве.


c gtk
person user3219057    schedule 21.01.2014    source источник
comment
@BLUEPIXY Почему люди всегда комментируют такие ответы вместо того, чтобы правильно отвечать на вопрос. ТАК зависит от правильного использования, поэтому вопросы помечаются как отвеченные, и ОП может принимать только ответы, а не комментарии.   -  person Alfe    schedule 21.01.2014
comment
@Alfe: Ответ, который не является формальным / идеальным, много раз подвергается придиркам или отрицательным голосам, поэтому вместо выполнения всех формальностей люди просто комментируют и позволяют другим взять пирог.   -  person legends2k    schedule 21.01.2014
comment
@legends2k Или самый быстрый пистолет на западе. Проще всего дать быстрый и грязный ответ в комментариях, пока вы формализуете его в ответ. Если другие говорят, что вы заслуживаете похвалы, это, по сути, приглашение уделять вам столько времени, сколько вам нужно. В противном случае, как вы сказали, кто-то, кто лучше пишет ответы, может получить кредит.   -  person    schedule 21.01.2014
comment
@Alfe Я пока изучаю намерения спрашивающего в комментариях, если вопрос не ясен. Кроме того, как правило, в случае вопросов и ответов мало значения.   -  person BLUEPIXY    schedule 21.01.2014
comment
Скорее всего, это дублирующий вопрос. Но поиск дублирующей ссылки потребует больше усилий, чем написание ответа, так что...   -  person Lundin    schedule 21.01.2014


Ответы (2)


#include <stdint.h> // better integer types
#include <stdlib.h> // strtoul, NULL

const char* p = "88";
uint8_t s = (uint8_t) strtoul(p, NULL, 16);

Комментарии:

  • Указатели на строковые литералы всегда должны быть объявлены как константы.
  • Для небольших целочисленных типов предпочтительнее использовать типы из stdint.h, поскольку они более безопасны, чем целые типы по умолчанию (например, int).
  • Существует ряд функций, которые могут преобразовать строку в целое число. Наиболее гибкими являются функции "strto...": strtol (строка в singed long), strtoul (string в unsigned long), strtod (string в double) и так далее. Не существует таких функций преобразования для целочисленных типов меньше long.
  • Вы хотите, чтобы результат был без знака, поэтому рекомендуется использовать функцию strtoul, чтобы предотвратить различные проблемы с продвижением неявного типа.
  • Поскольку функция возвращает unsigned long, приведите ее к предполагаемому типу, то есть к uint8_t.
  • Третий параметр функции сообщает, какое основание вы хотите иметь для преобразования числа. 2 для двоичного, 8 для восьмеричного, 10 для десятичного или 16 для шестнадцатеричного.
person Lundin    schedule 21.01.2014
comment
Также обратите внимание, что существует ленивая/простая стандартная версия strtol(..., 10), которая называется atoi (от ASCII до int). Эта функция является стандартизированной оболочкой для strtol. В некоторых компиляторах есть соответствующая функция itoa (от int до ASCII), но она не стандартна для C. - person Lundin; 21.01.2014
comment
В С++ 11 стандартной версией itoa является to_string. - person legends2k; 21.01.2014
comment
@ legends2k Это помечено как C. C++ — это другой язык программирования. - person Lundin; 21.01.2014
comment
Это действительно так; упущение с моей стороны. - person legends2k; 21.01.2014

#include <stdlib.h>

char *end = NULL;
s = strtol(p, &end, 16);
//check errno here
if (p==end)
    printf ("I smell fish - most likely something is wrong.");

Имейте в виду, что база ограничена диапазоном [2-36]

Насколько мне известно, нет glib/gtk+ конкретной оболочки для strtol

Полный пример см. в разделе man strtol.

person drahnr    schedule 21.01.2014