Я использую gtk+. Как преобразовать строку в шестнадцатеричный формат, например char*p="88" в unsigned char s=0x88. Мне нужно присвоить строковое значение из таблицы байтовому элементу в массиве.
Преобразование строки в шестнадцатеричный формат, например 88, в 0x88.
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
Также обратите внимание, что существует ленивая/простая стандартная версия
strtol(..., 10)
, которая называется atoi
(от ASCII до int). Эта функция является стандартизированной оболочкой для strtol
. В некоторых компиляторах есть соответствующая функция itoa
(от int до ASCII), но она не стандартна для C.
- person Lundin; 21.01.2014
В С++ 11 стандартной версией
itoa
является to_string
.
- person legends2k; 21.01.2014
@ legends2k Это помечено как C. C++ — это другой язык программирования.
- person Lundin; 21.01.2014
Это действительно так; упущение с моей стороны.
- 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