字节流转化为文件流_将图片(二进制文件)存储于数据库,论文件字节流与二进制字符串相互转换...

本文介绍了如何在C++中将文件字节流转化为二进制字符串,以便存储到数据库中。通过示例代码,演示了读取图片文件,将其转化为二进制字符串,然后从数据库读取后重新转回文件字节流并写入新文件,确保文件内容一致。此外,还展示了字符串与二进制之间的转换应用,如加密日记。
摘要由CSDN通过智能技术生成

开发中遇到存储图片文件于数据库这样的需求。

我们知道文件本身就是一份二进制数据,不同类型的文件只是编码形式不同,对应的解读形式不同,无论txt文件、jpg文件亦或是mp4文件,本质上都是0和1组成的。而在C++中我们可以通过字节流来读写文件,也就是说我们可以把文件读入char数组中,也可以将char数组中的数据写入为文件。

开发中需要将图片存在数据库中,每个文件几KB,想将之存在数据库表的varchar类型中。大小不是问题,大的话就以text类型存储。关键是,C++读取的文件字节流的char数组是不能直接存储的,因为里面会含有很多‘\0’。如果按照字符串来理解,就是结束符了。那样一来存的内容就不完整了。

所以需要将文件字节流的char数组 转化为二进制字符串,再存储数据库。

从数据库读取后,再转化回文件字节流的char数组。

每一个char,其实就是一个字节,也就是8bit,每个bit是0或者1。我要做的就是读取每一位,将之转化为字符的'0'或者'1',再存储。

所以如果原本是N字节的文件,转化后大小为N*8。

下面是我文件字节流与二进制字符串相互转换的测试程序,参考了几篇文章,里面的程序我略有修改:

http://blog.csdn.net/k346k346/article/details/52170623

http://blog.csdn.net/pointer_y/article/details/51525679

将一个名为timg.jpg的文件,放在程序目录下,程序会将之读取,转化为二进制字符串,然后再转化回去,写入为文件timg2.jpg。

运行结束后会生成一个timg2.jpg,且和timg.jpg一模一样。

该程序还会作 字符串转化的测试,效果为:

#include "stdafx.h"#include"iostream"#include"string.h"#include#include

using namespacestd;#define P1LEN 10013

#define P2LEN 80104

/**

* 设置一个字符第n位bit值

* 2018-02-06*/

int bit_set(unsigned char *p_data, unsigned char position, intflag) {int i = 0;

assert(p_data);if (position > 8 || position < 1 || (flag != 0 && flag != 1))return -1;if (flag != (*p_data >> (position - 1) & 1))*p_data ^= 1 << (position - 1);return 0;

}/**

* 字符数组 与 二进制字符串 相互转化

* 2018-02-06*/

int char_array_2_binary_str(char ch_buf[],int ch_len,char binary_char_buf[],int binary_char_len,inttype){if(type!=0&&type!=1)return -1;//字节流转二进制字符流

if(type==0){if(binary_char_len < 8*ch_len)return -1;int char_buf_index=0;for(int i=0;i=0;--j){if(ch_buf[i]>>j&0x1)

binary_char_buf[char_buf_index++]='1';elsebinary_char_buf[char_buf_index++]='0';

}

}return 0;

}if (type == 1) {if(8*ch_len

strncpy(tmp_str, binary_char_buf+i, 8);for(int j=0; j<8; ++j){if (tmp_str[j] == '0')

bit_set((unsignedchar *)ch_buf+ret_buf_index, 8-j, 0);if (tmp_str[j] == '1')

bit_set((unsignedchar *)ch_buf+ret_buf_index, 8-j, 1);

}

ret_buf_index++;

}return 0;

}

}int _tmain(int argc, _TCHAR*argv[]) {首先,字符串转换测试

char* txt = "异度神剑";

cout<< "原始字符串为:"<< txt << endl <

char_array_2_binary_str(txt,8,binary_txt_buf,64,0);

binary_txt_buf[64] = '\0';

cout<< "转化后的二进制字符串为:" << binary_txt_buf << endl <

char_array_2_binary_str(txt2,8,binary_txt_buf,64,1);

txt2[8] = '\0';

cout<< "转化回原始字符串为:" <

const char * filename = "timg.jpg";const char * filename2 = "timg2.jpg";

ifstream infile(filename,ios::in|ios::binary);if(!infile)

abort( );//存储图片的char数组空间

charpic_buf[P1LEN];

infile.read(pic_buf,P1LEN);

infile.close();//转换成2进制字符串的存储空间

charret_buf[P2LEN];

char_array_2_binary_str(pic_buf,P1LEN,ret_buf,P2LEN,0);//转换回来

charpic_buf2[P1LEN];

char_array_2_binary_str(pic_buf2,P1LEN,ret_buf,P2LEN,1);

ofstream outfile(filename2,ios::out|ios::binary);if(!outfile)

abort( );//写入文件,生成timg2.jpg

outfile.write(pic_buf2,P1LEN);

outfile.close();///文件转换测试结束///

return 0;

}

本来需求就是存储图片于数据库,理论上已经实现了。现在我想到字符串和二进制的转化应该是很有趣的。比如以后我写文章:1101001011101100101101101100100011001001111100011011110110100011

你能看懂什么意思吗?

但我用自己程序转化一下,就看懂了。

以后可以写个带界面的字符串和二进制的转化程序。

就可以很方便地对自己写的日记作加密了。

到时我会将代码上传到github,或可期待开个新坑……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值