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


有時候我們需要將基本數據類型轉化為字節,以便寫入文件,然后必要時還需要將這些字節讀出來。有人說,為啥不把數字直接存進文件呢?比如: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;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM