Boost 学习之算法篇 hex

15 篇文章 0 订阅
3 篇文章 0 订阅
本文深入探讨了Boost算法库中的hex工具,它用于将字节序列转换为十六进制表示。通过学习,读者可以掌握如何在C++中有效地进行二进制到十六进制的转换操作。
摘要由CSDN通过智能技术生成

原文链接:http://www.boost.org/doc/libs/1_60_0/libs/algorithm/doc/html/the_boost_algorithm_library/Misc/hex.html

hex

    头文件“boost/algorithm/hex.hpp” 包含了两个算法:hex、unhex以及他们各自的三个版本的变体。hex将一个序列元素转换为十六进制数,unhex功能正好相反。
    hex 和 unhex ,来源于MySQL,原来他们用在数据库中做查询和保存程序用。

接口
    hex函数带一个值序列,并写入十六进制字符。有是三个不同的接口,这些接口仅仅是传入传入参数有所不同。第一个接口带一对迭代器做形参;第二个接口带一个指针,该指针指向以0结尾的序列的起始位置,就是指向一个类似C格式的字符串的起始位置;第三个接口带一个通过Boost.Range库限定的一个集合。

官方接口
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 );



十六进制仅仅使用'0'..'9'以及'A'..'F'组成的值表示,但是输出却不止限定字符。输出的迭代器可以指向一个wstring 或者一个integers类型的vector,或者是其他任何证书类型。

函数unhex 将hex的输出转换回值序列。
unhex不同接口的输入参数和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的输入参数不是一个以一个十六进制表示的序列("event number"),这将抛出一个boost::algorithm::not_enough_input 异常。
假如unhex传递的参数包含了非十六进制字符,那么将会抛出boost::algorithm::non_hex_input的异常。
假如你希望捕获所有的编码错误,那么可以通过捕获ype boost::algorithm::hex_decode_error该异常来获取.

例子
假如输出是一个指向值的迭代器,同时不指向wchar_t值则:
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函数以及派生的接口,都通过值或者常引用传递参数,不依赖任何全局的状态。因此,他们提供了很强的异常安全性保证。然而,当作用在输入迭代器(input iterators)的时候,假如有异常抛,输入迭代器将不会重置为原来的状态。
注意
    hex和unhex当接受空序列的时候不做任何操作。hex and unhex both do nothing when passed empty ranges.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值