【語言基礎】c++ 基本數據類型與字節數組(string,char [] )之間的轉化方法

有時候咱們須要將基本數據類型轉化爲字節,以便寫入文件,而後必要時還須要將這些字節讀出來。有人說,爲啥不把數字直接存進文件呢?好比: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;
}
相關文章
相關標籤/搜索