【语言基础】c++ 基本数据类型与字节数组(string,char [] )之间的转化方法
有时候我们需要将基本数据类型转化为字节,以便写入文件,然后必要时还需要将这些字节读出来。有人说,为啥不把数字直接存进文件呢?比如:100,000,000,我们直接存数字明文到文件那就是9个字符(char,9*8bit=9Byte),如果存int就是4Byte,差了一倍多,所以这样存不划算。
有三种方法:
1. 与运算,该方法适用于整数类型
思路就是利用0xff取与最低位,可将高位全置为0,而保留最地位,所以这样我们能得到整数的每一位的字节值(8bit=1Byte)
1 2 3 4 5 6 7 8 9 10 | 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; } |
1 2 3 4 5 6 7 | 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*指针每加一就会移动一个字节,所以我们能逐个字节的读取到基本类型的数据。
1 2 3 4 5 6 7 8 9 | 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个字节。所以我们只要将目标类型的指针指向一片正确的内存区域,我们在利用该指针取值时就能得到正确的数据了。
1 2 3 4 5 6 | double getDouble( const string & x ) { char * p = const_cast < char *>(x.c_str()); double * _return = 0; _return = reinterpret_cast < double *>(p); return *_return; } |
关注分布式存储技术以及分布式计算方法
分类:
c++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?