有時候我們需要將基本數據類型轉化為字節,以便寫入文件,然后必要時還需要將這些字節讀出來。有人說,為啥不把數字直接存進文件呢?比如:100,000,000,我們直接存數字明文到文件那就是9個字符(char,9*8bit=9Byte),如果存int就是4Byte,差了一倍多,所以這樣存不划算。
有三種方法:
1. 與運算,該方法適用於整數類型
思路就是利用0xff取與最低位,可將高位全置為0,而保留最地位,所以這樣我們能得到整數的每一位的字節值(8bit=1Byte)
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. 指針逐位讀取字節
該思路就是我們可以把指針強制轉化為char * ,因為指針本身就是一個長整型的整數而已,只不過是類型不同。轉化之后,char*指針每加一就會移動一個字節,所以我們能逐個字節的讀取到基本類型的數據。
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. 指針強制轉化
利用不通指針類型去批量讀取字節個數。比如char*每次取值只取一個字節,而long*每次取8個字節。所以我們只要將目標類型的指針指向一片正確的內存區域,我們在利用該指針取值時就能得到正確的數據了。
double getDouble( const string & x ) { char * p = const_cast<char*>(x.c_str()); double * _return = 0; _return = reinterpret_cast<double*>(p); return *_return; }