Файл заголовка<'boost/algorithm/hex.hpp'
>содержит три варианта каждого из двух алгоритмов,<hex
>и<unhex
>. Они являются обратными алгоритмами, то есть один отменяет усилия другого.<hex
>берет последовательность значений и превращает их в шестнадцатеричные символы.<unhex
>берет последовательность шестнадцатеричных символов и выводит последовательность значений.
<hex
>и<unhex
>происходят из MySQL, где они используются в запросах базы данных и хранящихся процедурах.
Функция<hex
>принимает последовательность значений и пишет шестнадцатеричные символы. Существует три различных интерфейса, отличающихся только тем, как указана входная последовательность.
Первый берет пару итераторов. Второй принимает указатель к началу нулевой последовательности, такой как строка c, а третий принимает диапазон, как определено Boost. Библиотека рангов.
template <typename InputIterator, typename OutputIterator>
OutputIterator hex ( InputIterator first, InputIterator last, OutputIterator out );
template <typename T, typename OutputIterator>
OutputIterator hex ( const T *ptr, OutputIterator out );
template <typename Range, typename OutputIterator>
OutputIterator hex ( const Range &r, OutputIterator out );
<hex
>записывает только значения в диапазоне '0'.'9' и 'A'.'F', но не ограничивается выводом символов. Выходной итератор может относиться к строчке, или вектору целых чисел, или любому другому интегральному типу.
Функция<unhex
>берет выход<hex
>и превращает его обратно в последовательность значений.
hex
.
.
template <typename InputIterator, typename OutputIterator>
OutputIterator unhex ( InputIterator first, InputIterator last, OutputIterator out );
template <typename T, typename OutputIterator>
OutputIterator unhex ( const T *ptr, OutputIterator out );
template <typename Range, typename OutputIterator>
OutputIterator unhex ( const Range &r, OutputIterator out );
Заголовок hex.hpp определяет три класса исключений:
struct hex_decode_error: virtual boost::exception, virtual std::exception {};
struct not_enough_input : public hex_decode_error;
struct non_hex_input : public hex_decode_error;
Если на входе<unhex
>не содержится «четного числа» шестизначных цифр, то выбрасывается исключение типа<boost::algorithm::not_enough_input
>.
Если<unhex
>содержит какие-либо не шестнадцатеричные символы, то бросается исключение типа<boost::algorithm::non_hex_input
>.
Если вы хотите уловить все ошибки декодирования, вы можете уловить исключения типа<boost::algorithm::hex_decode_error
>.
Предполагая, что<out
>является итератором, который принимает<char
>значения, и<wout
>принимает<wchar_t
>значения (и этот размер ( wchar_t) == 2)
hex ( "abcdef", out ) --> "616263646566"
hex ( "32", out ) --> "3332"
hex ( "abcdef", wout ) --> "006100620063006400650066"
hex ( "32", wout ) --> "00330032"
unhex ( "616263646566", out ) --> "abcdef"
unhex ( "3332", out ) --> "32"
unhex ( "616263646566", wout ) --> "\6162\6364\6566" ( i.e, a 3 character string )
unhex ( "3332", wout ) --> "\3233" ( U+3332, SQUARE HUARADDO )
unhex ( "3", out ) --> Error - not enough input
unhex ( "32", wout ) --> Error - not enough input
unhex ( "ACEG", out ) --> Error - non-hex input
<hex
>и<unhex
>работают на всех типах итераторов.
Все варианты<hex
>и<unhex
>выполняются вO(N)(линейное) время; то есть они обрабатывают каждый элемент во входной последовательности один раз.
Все варианты<hex
>и<unhex
>берут свои параметры по стоимости или по ссылке и не зависят от какого-либо глобального состояния. Таким образом, все процедуры в этом файле обеспечивают сильную гарантию исключения. Однако при работе с итераторами ввода, если выкинуто исключение, итераторы ввода не будут сбрасывать свои исходные значения (т.е. символы, прочитанные из итератора, не могут быть непрочитаны).
- <
hex
>и<unhex
>ничего не делают, когда проходят пустые диапазоны.