zoukankan      html  css  js  c++  java
  • 【语言基础】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;
    }
    

      

  • 相关阅读:
    贝叶斯公式由浅入深大讲解—AI基础算法入门
    再谈前端HTML模板技术
    再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结
    mac版chrome升级到Version 65.0.3325.18后无法打开百度bing搜狗
    图说js中的this——深入理解javascript中this指针
    web app响应式字体设置!rem之我见
    【2020-04-18】 加班
    【2020-04-06】汇郡海下的沉思
    【2020-03-28】Dubbo源码杂谈
    【2020-03-21】Dubbo本地环境搭建-实现服务注册和消费
  • 原文地址:https://www.cnblogs.com/colorfulkoala/p/3487988.html
Copyright © 2011-2022 走看看