有時候咱們須要將基本數據類型轉化爲字節,以便寫入文件,而後必要時還須要將這些字節讀出來。有人說,爲啥不把數字直接存進文件呢?好比:100,000,000,咱們直接存數字明文到文件那就是9個字符(char,9*8bit=9Byte),若是存int就是4Byte,差了一倍多,因此這樣存不划算。指針
有三種方法:blog
1. 與運算,該方法適用於整數類型內存
思路就是利用0xff取與最低位,可將高位全置爲0,而保留最地位,因此這樣咱們能獲得整數的每一位的字節值(8bit=1Byte)get
string toBytes( unsigned int x ) { std::size_t size = sizeof(x); std::size_t cnt = size; string _return(size,0); while( cnt-- ) { unsigned char byte = (unsigned char)((x>>((size-1-cnt)*8)) & 0xff); _return[ cnt ] = byte; } return _return; }
unsigned int getUInt( const string & x ) { unsigned int _return = 0; for( std::size_t i = 0; i < x.size(); ++i ) { _return += static_cast<unsigned char>( x[x.size()-1-i]) *static_cast<unsigned int>(pow( 256, i )); } return _return; }
2. 指針逐位讀取字節string
該思路就是咱們能夠把指針強制轉化爲char * ,由於指針自己就是一個長整型的整數而已,只不過是類型不一樣。轉化以後,char*指針每加一就會移動一個字節,因此咱們能逐個字節的讀取到基本類型的數據。it
string toBytes( double x ) { std::size_t size = sizeof(x); string _return(size,0); char * start = reinterpret_cast<char *>(&x); for(std::size_t i = 0; i<size; i++ ) { _return[i] = *(start + i); } return _return; }
3. 指針強制轉化ast
利用不通指針類型去批量讀取字節個數。好比char*每次取值只取一個字節,而long*每次取8個字節。因此咱們只要將目標類型的指針指向一片正確的內存區域,咱們在利用該指針取值時就能獲得正確的數據了。class
double getDouble( const string & x ) { char * p = const_cast<char*>(x.c_str()); double * _return = 0; _return = reinterpret_cast<double*>(p); return *_return; }