需求:做dbms时将所有数据以char形式保留在硬盘上,需要时载入内存,进行字节流的拼接还原为原来的数据类型

首先为什么是char,因为char只占一个byte,粒度小,也便于操作;
字节流拼可以使用char数组轻松实现,但是如何还原原来的数据类型呢?
C++/C本身有很多格式转换的函数可以调用,但是本质上只是改变了数据的表现形式而已,我们拥有了字节流,就有了原始材料,只要我们知道这段字节流的意义(数据类型),我们就应当可以随心所欲地操作它:

使用指针强制转换地方式

比如我们将一段数据以char字节流地形式写入磁盘,其中包括了某个人的出生年份,一个unsigned int无符号整型数。某一天,我们突然想读取这个数。
我们可以使用fopen、fseek找到这个无符号整型数开始的字节位置,使用fread读取4byte数据,注意,这时候为这4byte数据指定何种数据类型都是无所谓的,它只关乎表现形式而已,这4byte数据并不随你如何指定类型而发生改变。接下来,可以使用数组如char brthyr []将他们组合,然后将这个数组的内存地址(即指针)强制转换到一个无符号整型数指针unsigned int * brthday上。代码如下

unsigned int * brthyr_ptr;
        char brthyr[4];
        for (int i = 0; i < 4; i++)
        {
            brthyr[i] = buff->frames[frame_id].field[i];
        }
        brthyr_ptr = (unsigned int *)&brthyr;
        cout << "出生年份:" << *brthyr_ptr << endl;;

具体可以参考我写的dbms_buffer

最后修改日期: 2018年11月4日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。