c : разобрать шестнадцатеричное число внутри длинной строки

Я анализирую файл XML с помощью libxml2, и мне нужно извлечь шестнадцатеричное число из атрибута xml. Теперь lib2xml не дает строку с нулевым завершением для атрибута, а только указатели на начало и конец атрибута.

Итак, учитывая .........FILL:BB0011AA;............... (где точки обозначают произвольные символы), char* begin указывает на F в FILL, а char* end указывает на точку с запятой, как я могу эффективно извлечь шестнадцатеричное число, БЕЗ создания копии в строку с нулевым завершением?


person Jacko    schedule 28.04.2011    source источник


Ответы (1)


Вот так:

unsigned int value;
if(sscanf(begin, "FILL:%x;", &value) != 1)
   printf("Parse error\n");

Я думаю, что приведенное выше безопасно, даже если данные в begin вообще не являются строкой, то есть если они не содержат терминатор NUL. Поскольку %x прервется, если будет найден какой-либо нешестнадцатеричный символ, не должно быть никакого риска того, что он уйдет в ля-ля землю в памяти. Я не могу придумать случай, когда он выйдет из-под контроля.

person unwind    schedule 28.04.2011
comment
Прохладный. Я думал, что начало должно указывать на строку с нулевым завершением. - person Jacko; 28.04.2011
comment
value на самом деле должен быть типа unsigned int. - person Sven Marnach; 28.04.2011
comment
Спасибо, расслабься. И begin, вероятно, имеет нулевой терминатор в самом конце. Но, очевидно, я не хочу, чтобы синтаксический анализ выполнялся из соображений производительности. - person Jacko; 28.04.2011
comment
не будет ли strtoul более эффективным? это позволяет избежать разбора спецификатора формата и т. д., а в остальном (на самом деле) работает так же. - person andrew cooke; 14.05.2011