第0章 导读
第1章 Boost程序库总论
1.什么是Boost
2. 如何使用Boost
3.什么是STLprot
4.开发环境
第2章 时间与日期
1. timer库
代码如下:
View Code
#include <iostream>
#include <boost/timer.hpp>
using namespace std;
using namespace boost;
int main(){
timer t;
cout<< " max timespan: "<<t.elapsed_max()/ 3600<< " h "<<endl;
cout<< " min timespan: "<<t.elapsed_min()<< " s "<<endl;
cout<< " now time elapsed: "<<t.elapsed()<< " s "<<endl;
}
#include <boost/timer.hpp>
using namespace std;
using namespace boost;
int main(){
timer t;
cout<< " max timespan: "<<t.elapsed_max()/ 3600<< " h "<<endl;
cout<< " min timespan: "<<t.elapsed_min()<< " s "<<endl;
cout<< " now time elapsed: "<<t.elapsed()<< " s "<<endl;
}
2. progress_timer使用
3. progress_display使用
代码如下:
View Code
#include <iostream>
#include <fstream>
#include <vector>
#include < string>
#include <boost/progress.hpp>
using namespace std;
using namespace boost;
int main(){
vector< string> v( 1000000);
ofstream fs( " a.txt ");
if(!fs){
cout<< " can't open file a.txt "<<endl;
return - 1;
}
progress_display pd(v.size());
vector< string>::iterator pos;
for(pos=v.begin();pos!=v.end();++pos){
fs<<*pos<<endl;
++pd;
}
}
#include <fstream>
#include <vector>
#include < string>
#include <boost/progress.hpp>
using namespace std;
using namespace boost;
int main(){
vector< string> v( 1000000);
ofstream fs( " a.txt ");
if(!fs){
cout<< " can't open file a.txt "<<endl;
return - 1;
}
progress_display pd(v.size());
vector< string>::iterator pos;
for(pos=v.begin();pos!=v.end();++pos){
fs<<*pos<<endl;
++pd;
}
}
4.date_time库
部分测试代码如下:
View Code
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time.hpp>
#include <algorithm>
#define BOOST_DATE_TIME_SOURCE
using namespace std;
using namespace boost::gregorian;
// using namespace boost;
void test1(){
date d( 2008, 11, 20);
// cout<<to_simple_string(d)<<endl;
// cout<<to_iso_string(d)<<endl;
// cout<<to_iso_extended_string(d)<<endl;
cout<<d<<endl;
// cin>>d;
// cout<<d;
}
void test2(){
date d1( 2000, 1, 1),d2( 2008, 8, 8);
cout<<d2-d1<<endl;
}
void test3(){
date d( 2008, 11, 20);
date d_start(d.year(),d.month(), 1);
date d_end=d.end_of_month();
for(day_iterator d_iter(d_start);
d_iter!=d_end;++d_iter){
cout<<*d_iter<< " "<<
d_iter->day_of_week()<<endl;
}
}
void test4(){
date d( 2008, 11, 20);
date d18years=d+years( 18);
cout<<d18years<< " is "<<d18years.day_of_week()<<endl;
int count= 0;
for(day_iterator d_iter(date(d18years.year(), 11, 1));
d_iter!=d18years.end_of_month();++d_iter){
if(d_iter->day_of_week()==Sunday)
++count;
}
cout<< " total "<<count<< " Sundays. "<<endl;
count= 0;
for(month_iterator m_iter(date(d18years.year(), 1, 1));
m_iter<date(d18years.year()+ 1, 1, 1);++m_iter){
count+=m_iter->end_of_month().day();
}
cout<< " total "<<count<< " days of year. "<<endl;
}
class credit_card{
public:
string bank_name;
int bill_day_no;
credit_card( const char* bname, int no):
bank_name(bname),bill_day_no(no){}
int calc_free_days(date consume_day=day_clock::local_day()) const{
date bill_day(consume_day.year(),consume_day.month(),bill_day_no);
if(consume_day>bill_day){
bill_day+=months( 1);
}
return (bill_day-consume_day).days()+ 20;
}
friend bool operator<( const credit_card& l, const credit_card& r){
return l.calc_free_days()<r.calc_free_days();
}
};
void test5(){
credit_card a( " A_bank ", 25);
credit_card b( " B_bank ", 12);
credit_card tmp=std::max(a,b);
cout<< " You should use "<<tmp.bank_name<< " , free days = "<<tmp.calc_free_days()<<endl;
}
int main(){
test5();
}
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time.hpp>
#include <algorithm>
#define BOOST_DATE_TIME_SOURCE
using namespace std;
using namespace boost::gregorian;
// using namespace boost;
void test1(){
date d( 2008, 11, 20);
// cout<<to_simple_string(d)<<endl;
// cout<<to_iso_string(d)<<endl;
// cout<<to_iso_extended_string(d)<<endl;
cout<<d<<endl;
// cin>>d;
// cout<<d;
}
void test2(){
date d1( 2000, 1, 1),d2( 2008, 8, 8);
cout<<d2-d1<<endl;
}
void test3(){
date d( 2008, 11, 20);
date d_start(d.year(),d.month(), 1);
date d_end=d.end_of_month();
for(day_iterator d_iter(d_start);
d_iter!=d_end;++d_iter){
cout<<*d_iter<< " "<<
d_iter->day_of_week()<<endl;
}
}
void test4(){
date d( 2008, 11, 20);
date d18years=d+years( 18);
cout<<d18years<< " is "<<d18years.day_of_week()<<endl;
int count= 0;
for(day_iterator d_iter(date(d18years.year(), 11, 1));
d_iter!=d18years.end_of_month();++d_iter){
if(d_iter->day_of_week()==Sunday)
++count;
}
cout<< " total "<<count<< " Sundays. "<<endl;
count= 0;
for(month_iterator m_iter(date(d18years.year(), 1, 1));
m_iter<date(d18years.year()+ 1, 1, 1);++m_iter){
count+=m_iter->end_of_month().day();
}
cout<< " total "<<count<< " days of year. "<<endl;
}
class credit_card{
public:
string bank_name;
int bill_day_no;
credit_card( const char* bname, int no):
bank_name(bname),bill_day_no(no){}
int calc_free_days(date consume_day=day_clock::local_day()) const{
date bill_day(consume_day.year(),consume_day.month(),bill_day_no);
if(consume_day>bill_day){
bill_day+=months( 1);
}
return (bill_day-consume_day).days()+ 20;
}
friend bool operator<( const credit_card& l, const credit_card& r){
return l.calc_free_days()<r.calc_free_days();
}
};
void test5(){
credit_card a( " A_bank ", 25);
credit_card b( " B_bank ", 12);
credit_card tmp=std::max(a,b);
cout<< " You should use "<<tmp.bank_name<< " , free days = "<<tmp.calc_free_days()<<endl;
}
int main(){
test5();
}
5.总结
第3章 内存管理
1. RAII机制
2. 智能指针
3. scoped_ptr
测试代码如下:
View Code
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
struct posix_file{
posix_file( const char* file_name){
cout<< " open file: "<<file_name<<endl;
}
~posix_file(){
cout<< " close file "<<endl;
}
};
int main(){
scoped_ptr< int> p( new int);
if(p){
*p= 100;
cout<<*p<<endl;
}
p.reset();
assert(p== 0);
if(!p){
cout<< " scoped_ptr==null "<<endl;
}
scoped_ptr<posix_file> fp( new posix_file( " a.txt "));
}
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
struct posix_file{
posix_file( const char* file_name){
cout<< " open file: "<<file_name<<endl;
}
~posix_file(){
cout<< " close file "<<endl;
}
};
int main(){
scoped_ptr< int> p( new int);
if(p){
*p= 100;
cout<<*p<<endl;
}
p.reset();
assert(p== 0);
if(!p){
cout<< " scoped_ptr==null "<<endl;
}
scoped_ptr<posix_file> fp( new posix_file( " a.txt "));
}
scope_ptr与auto_ptr的区别
4. scope_array
5. shared_ptr
测试代码:
View Code
#include <iostream>
#include < string>
#include <vector>
#include <boost/smart_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace std;
using namespace boost;
void test1(){
shared_ptr< int> sp( new int( 10));
cout<<*sp<<endl;
shared_ptr< int> sp2=sp;
cout<<*sp<<endl;
*sp2= 100;
cout<<*sp2<<endl;
}
class shared{
private:
shared_ptr< int> p;
public:
shared(shared_ptr< int> p_):p(p_){}
void print(){
cout<< " count: "<<p.use_count()<< " v= "<<*p<<endl;
}
};
void print_func(shared_ptr< int> p){
cout<< " count: "<<p.use_count()<< " v= "<<*p<<endl;
}
void test2(){
shared_ptr< int> p( new int( 100));
shared s1(p),s2(p);
s1.print();
s2.print();
*p= 20;
print_func(p);
s1.print();
}
void test3(){
shared_ptr< string> sp=make_shared< string>( " make_shared ");
cout<<*sp<<endl;
shared_ptr<vector< int> > spv=make_shared<vector< int> >( 10, 2);
// cout<<*spv<<endl;
cout<<spv->size()<<endl;
}
void test4(){
typedef vector<shared_ptr< int> > vs;
vs v( 10);
int i= 0;
for(vs::iterator pos=v.begin();pos!=v.end();++pos){
*pos=make_shared< int>(++i);
cout<<*(*pos)<< " , ";
}
cout<<endl;
shared_ptr< int> p=v[ 9];
*p= 100;
cout<<*v[ 9]<<endl;
}
class sample{
private:
class impl;
shared_ptr<impl> p;
public:
sample();
void print();
};
class sample::impl{
public:
void print(){
cout<< " impl print "<<endl;
}
};
sample::sample():p( new impl){}
void sample::print(){
p->print();
}
void test5(){
sample s;
s.print();
}
class abstract{
public:
virtual void f()= 0;
virtual void g()= 0;
protected:
virtual ~ abstract(){}
};
class impl2: public abstract{
public:
void f(){
cout<< " class impl2 f "<<endl;
}
void g(){
cout<< " class impl2 g "<<endl;
}
};
class impl3: public abstract{
public:
void f(){
cout<< " class impl3 f "<<endl;
}
void g(){
cout<< " class impl3 g "<<endl;
}
};
shared_ptr< abstract> create_impl2(){
return shared_ptr< abstract>( new impl2);
}
shared_ptr< abstract> create_impl3(){
return shared_ptr< abstract>( new impl3);
}
void test6(){
shared_ptr< abstract> p2=create_impl2();
p2->f();
p2->g();
shared_ptr< abstract> p3=create_impl3();
p3->f();
p3->g();
}
int main(){
test6();
}
#include < string>
#include <vector>
#include <boost/smart_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace std;
using namespace boost;
void test1(){
shared_ptr< int> sp( new int( 10));
cout<<*sp<<endl;
shared_ptr< int> sp2=sp;
cout<<*sp<<endl;
*sp2= 100;
cout<<*sp2<<endl;
}
class shared{
private:
shared_ptr< int> p;
public:
shared(shared_ptr< int> p_):p(p_){}
void print(){
cout<< " count: "<<p.use_count()<< " v= "<<*p<<endl;
}
};
void print_func(shared_ptr< int> p){
cout<< " count: "<<p.use_count()<< " v= "<<*p<<endl;
}
void test2(){
shared_ptr< int> p( new int( 100));
shared s1(p),s2(p);
s1.print();
s2.print();
*p= 20;
print_func(p);
s1.print();
}
void test3(){
shared_ptr< string> sp=make_shared< string>( " make_shared ");
cout<<*sp<<endl;
shared_ptr<vector< int> > spv=make_shared<vector< int> >( 10, 2);
// cout<<*spv<<endl;
cout<<spv->size()<<endl;
}
void test4(){
typedef vector<shared_ptr< int> > vs;
vs v( 10);
int i= 0;
for(vs::iterator pos=v.begin();pos!=v.end();++pos){
*pos=make_shared< int>(++i);
cout<<*(*pos)<< " , ";
}
cout<<endl;
shared_ptr< int> p=v[ 9];
*p= 100;
cout<<*v[ 9]<<endl;
}
class sample{
private:
class impl;
shared_ptr<impl> p;
public:
sample();
void print();
};
class sample::impl{
public:
void print(){
cout<< " impl print "<<endl;
}
};
sample::sample():p( new impl){}
void sample::print(){
p->print();
}
void test5(){
sample s;
s.print();
}
class abstract{
public:
virtual void f()= 0;
virtual void g()= 0;
protected:
virtual ~ abstract(){}
};
class impl2: public abstract{
public:
void f(){
cout<< " class impl2 f "<<endl;
}
void g(){
cout<< " class impl2 g "<<endl;
}
};
class impl3: public abstract{
public:
void f(){
cout<< " class impl3 f "<<endl;
}
void g(){
cout<< " class impl3 g "<<endl;
}
};
shared_ptr< abstract> create_impl2(){
return shared_ptr< abstract>( new impl2);
}
shared_ptr< abstract> create_impl3(){
return shared_ptr< abstract>( new impl3);
}
void test6(){
shared_ptr< abstract> p2=create_impl2();
p2->f();
p2->g();
shared_ptr< abstract> p3=create_impl3();
p3->f();
p3->g();
}
int main(){
test6();
}
6. shared_array
测试代码:
View Code
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
int main(){
int *p= new int[ 100];
shared_array< int> sa(p);
shared_array< int> sa2=sa;
sa[ 0]= 10;
cout<<sa2[ 0]<<endl;
}
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
int main(){
int *p= new int[ 100];
shared_array< int> sa(p);
shared_array< int> sa2=sa;
sa[ 0]= 10;
cout<<sa2[ 0]<<endl;
}
7. weak_ptr
测试代码:
View Code
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
int main(){
shared_ptr< int> sp( new int( 10));
cout<<sp.use_count()<<endl;
weak_ptr< int> wp(sp);
cout<<wp.use_count()<<endl;
if(!wp.expired()){
shared_ptr< int> sp2=wp. lock();
*sp2= 100;
cout<<wp.use_count()<<endl;
}
cout<<wp.use_count()<<endl;
sp.reset();
cout<<wp.expired()<<endl;
cout<<wp. lock()<<endl;
}
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
int main(){
shared_ptr< int> sp( new int( 10));
cout<<sp.use_count()<<endl;
weak_ptr< int> wp(sp);
cout<<wp.use_count()<<endl;
if(!wp.expired()){
shared_ptr< int> sp2=wp. lock();
*sp2= 100;
cout<<wp.use_count()<<endl;
}
cout<<wp.use_count()<<endl;
sp.reset();
cout<<wp.expired()<<endl;
cout<<wp. lock()<<endl;
}
8. intrusive_ptr
9. pool库,最简单的pool
测试代码:
View Code
#include <iostream>
#include <boost/pool/pool.hpp>
using namespace std;
using namespace boost;
int main(){
pool<> pl( sizeof( int));
int *p=( int*)pl.malloc();
cout<<pl.is_from(p)<<endl;
pl.free(p);
for( int i= 0;i< 100;i++){
pl.ordered_malloc( 10);
}
}
#include <boost/pool/pool.hpp>
using namespace std;
using namespace boost;
int main(){
pool<> pl( sizeof( int));
int *p=( int*)pl.malloc();
cout<<pl.is_from(p)<<endl;
pl.free(p);
for( int i= 0;i< 100;i++){
pl.ordered_malloc( 10);
}
}
10. object_pool
测试代码:
View Code
#include <iostream>
#include <boost/pool/object_pool.hpp>
using namespace std;
using namespace boost;
struct demo_class{
public:
int a,b,c;
demo_class( int x= 1, int y= 2, int z= 3):a(x),b(y),c(z){}
};
int main(){
object_pool<demo_class>pl;
demo_class *p=pl.malloc();
cout<<pl.is_from(p)<<endl;
cout<<p->a<< " "<<p->b<< " "<<p->c<< " "<<endl;
p=pl.construct( 7, 8, 9);
cout<<p->a<< " "<<p->b<< " "<<p->c<< " "<<endl;
object_pool< string> pls;
for( int i= 0;i< 10;i++){
string *ps=pls.construct( " hello object_pool ",i);
cout<<*ps<<endl;
}
}
#include <boost/pool/object_pool.hpp>
using namespace std;
using namespace boost;
struct demo_class{
public:
int a,b,c;
demo_class( int x= 1, int y= 2, int z= 3):a(x),b(y),c(z){}
};
int main(){
object_pool<demo_class>pl;
demo_class *p=pl.malloc();
cout<<pl.is_from(p)<<endl;
cout<<p->a<< " "<<p->b<< " "<<p->c<< " "<<endl;
p=pl.construct( 7, 8, 9);
cout<<p->a<< " "<<p->b<< " "<<p->c<< " "<<endl;
object_pool< string> pls;
for( int i= 0;i< 10;i++){
string *ps=pls.construct( " hello object_pool ",i);
cout<<*ps<<endl;
}
}
11. singleton_pool
测试代码:
View Code
#include <iostream>
#include <boost/pool/singleton_pool.hpp>
using namespace std;
using namespace boost;
struct pool_tag{};
typedef singleton_pool<pool_tag, sizeof( int)> spl;
int main(){
int *p=( int*)spl::malloc();
cout<<spl::is_from(p)<<endl;
spl::release_memory();
}
#include <boost/pool/singleton_pool.hpp>
using namespace std;
using namespace boost;
struct pool_tag{};
typedef singleton_pool<pool_tag, sizeof( int)> spl;
int main(){
int *p=( int*)spl::malloc();
cout<<spl::is_from(p)<<endl;
spl::release_memory();
}
12.总结
第4章 实用工具
UUID通用唯一标识码
UUID中常用生成器
NIL生成器
字符串生成器
名字生成器
随机数生成器
一个增强的UUID类
UUID与字符串之间的转换
SHA1算法简介
测试代码:
View Code
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/uuid/sha1.hpp>
using namespace std;
using namespace boost;
using namespace boost::uuids;
using namespace boost::uuids::detail;
void test1(){
uuid u;
cout<<uuid::static_size()<<endl;
cout<<u.size()<<endl;
vector<unsigned char> v( 16, ' A ');
copy(v.begin(),v.end(),u.begin());
cout<< " v= ";
copy(v.begin(),v.end(),ostream_iterator<unsigned char>(cout, " "));
cout<<endl;
cout<< " u= "<<u<<endl;
fill_n(u.data+ 10, 6, 8);
cout<<u<<endl;
}
void nil_test(){
uuid u=nil_generator()();
cout<<u<<endl;
u=nil_uuid();
cout<<u<<endl;
}
void string_test(){
string_generator sgen;
uuid u1=sgen( " 0123456789abcdef0123456789abcdef ");
cout<<u1<<endl;
uuid u2=sgen( " 01234567-89ab-cdef-0123-456789abcdef ");
cout<<u2<<endl;
uuid u3=sgen(L " {01234567-89ab-cdef-0123-456789abcdef} ");
cout<<u3<<endl;
}
void name_test(){
uuid www_xxx_com=string_generator()( " {0123456789abcdef0123456789abcdef} ");
name_generator ngen(www_xxx_com);
uuid u1=ngen( " mario ");
cout<<u1.version()<<endl;
cout<<u1<<endl;
uuid u2=ngen( " link ");
cout<<u2<<endl;
}
void random_test(){
random_generator rgen;
uuid u=rgen();
cout<<u.version()<<endl;
cout<<u<<endl;
}
class uuid_t: public uuid{
private:
static random_generator rgen;
static string_generator sgen;
public:
uuid_t():uuid(rgen()){}
uuid_t( int):uuid(nil_uuid()){}
uuid_t( const char* str):uuid(sgen(str)){}
uuid_t( const uuid& u, const char *str):
uuid(name_generator(u)(str)){}
explicit uuid_t( const uuid& u):uuid(u){}
operator uuid(){
return static_cast<uuid&>(* this);
}
operator uuid() const{
return static_cast< const uuid&>(* this);
}
};
random_generator uuid_t::rgen;
string_generator uuid_t::sgen;
void uuid_t_test(){
uuid_t u0= 0;
cout<<u0<<endl;
uuid_t u1,u2;
cout<<u1<<endl;
cout<<u2<<endl;
uuid_t u3( " 0123456789abcdef0123456789abcdef ");
cout<<u3<<endl;
cout<<uuid_t(u3, " test name gen ")<<endl;
}
void lexical_test(){
uuid u=lexical_cast<uuid>( " 01234567-89ab-cdef-0123-456789abcdef ");
cout<<u<<endl;
string str=lexical_cast< string>(u);
cout<<str<<endl;
}
void sha1_test(){
sha1 sha;
char *szMsg= " a short message ";
sha.process_byte( 0x10);
sha.process_bytes(szMsg,strlen(szMsg));
sha.process_block(szMsg,szMsg+strlen(szMsg));
unsigned int digest[ 5];
sha.get_digest(digest);
for( int i= 0;i< 5;i++)
cout<<hex<<digest[i]<< ' ';
cout<<endl;
}
int main(){
sha1_test();
}
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/uuid/sha1.hpp>
using namespace std;
using namespace boost;
using namespace boost::uuids;
using namespace boost::uuids::detail;
void test1(){
uuid u;
cout<<uuid::static_size()<<endl;
cout<<u.size()<<endl;
vector<unsigned char> v( 16, ' A ');
copy(v.begin(),v.end(),u.begin());
cout<< " v= ";
copy(v.begin(),v.end(),ostream_iterator<unsigned char>(cout, " "));
cout<<endl;
cout<< " u= "<<u<<endl;
fill_n(u.data+ 10, 6, 8);
cout<<u<<endl;
}
void nil_test(){
uuid u=nil_generator()();
cout<<u<<endl;
u=nil_uuid();
cout<<u<<endl;
}
void string_test(){
string_generator sgen;
uuid u1=sgen( " 0123456789abcdef0123456789abcdef ");
cout<<u1<<endl;
uuid u2=sgen( " 01234567-89ab-cdef-0123-456789abcdef ");
cout<<u2<<endl;
uuid u3=sgen(L " {01234567-89ab-cdef-0123-456789abcdef} ");
cout<<u3<<endl;
}
void name_test(){
uuid www_xxx_com=string_generator()( " {0123456789abcdef0123456789abcdef} ");
name_generator ngen(www_xxx_com);
uuid u1=ngen( " mario ");
cout<<u1.version()<<endl;
cout<<u1<<endl;
uuid u2=ngen( " link ");
cout<<u2<<endl;
}
void random_test(){
random_generator rgen;
uuid u=rgen();
cout<<u.version()<<endl;
cout<<u<<endl;
}
class uuid_t: public uuid{
private:
static random_generator rgen;
static string_generator sgen;
public:
uuid_t():uuid(rgen()){}
uuid_t( int):uuid(nil_uuid()){}
uuid_t( const char* str):uuid(sgen(str)){}
uuid_t( const uuid& u, const char *str):
uuid(name_generator(u)(str)){}
explicit uuid_t( const uuid& u):uuid(u){}
operator uuid(){
return static_cast<uuid&>(* this);
}
operator uuid() const{
return static_cast< const uuid&>(* this);
}
};
random_generator uuid_t::rgen;
string_generator uuid_t::sgen;
void uuid_t_test(){
uuid_t u0= 0;
cout<<u0<<endl;
uuid_t u1,u2;
cout<<u1<<endl;
cout<<u2<<endl;
uuid_t u3( " 0123456789abcdef0123456789abcdef ");
cout<<u3<<endl;
cout<<uuid_t(u3, " test name gen ")<<endl;
}
void lexical_test(){
uuid u=lexical_cast<uuid>( " 01234567-89ab-cdef-0123-456789abcdef ");
cout<<u<<endl;
string str=lexical_cast< string>(u);
cout<<str<<endl;
}
void sha1_test(){
sha1 sha;
char *szMsg= " a short message ";
sha.process_byte( 0x10);
sha.process_bytes(szMsg,strlen(szMsg));
sha.process_block(szMsg,szMsg+strlen(szMsg));
unsigned int digest[ 5];
sha.get_digest(digest);
for( int i= 0;i< 5;i++)
cout<<hex<<digest[i]<< ' ';
cout<<endl;
}
int main(){
sha1_test();
}
总结: