1. 程式人生 > >將圖片(二進位制檔案)儲存於資料庫,論檔案位元組流與二進位制字串相互轉換

將圖片(二進位制檔案)儲存於資料庫,論檔案位元組流與二進位制字串相互轉換

開發中遇到儲存圖片檔案於資料庫這樣的需求。

我們知道檔案本身就是一份二進位制資料,不同型別的檔案只是編碼形式不同,對應的解讀形式不同,無論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 <fstream>
#include <assert.h>

using namespace std;

#define P1LEN 10013
#define P2LEN 80104

/**
 *    設定一個字元第n位bit值
 *    2018-02-06
 */
int bit_set(unsigned char *p_data, unsigned char
position, int flag) { 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,int type){ 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<ch_len;++i){ for(int j=7;j>=0;--j){ if(ch_buf[i]>>j&0x1) binary_char_buf[char_buf_index++]='1'; else binary_char_buf[char_buf_index++]='0'; } } return 0; } if (type == 1) { if(8*ch_len < binary_char_len) return -1; char tmp_str[9]=""; int ret_buf_index=0; for(int i=0;i<binary_char_len;i=i+8){ strncpy(tmp_str, binary_char_buf+i, 8); for(int j=0; j<8; ++j){ if (tmp_str[j] == '0') bit_set((unsigned char *)ch_buf+ret_buf_index, 8-j, 0); if (tmp_str[j] == '1') bit_set((unsigned char *)ch_buf+ret_buf_index, 8-j, 1); } ret_buf_index++; } return 0; } } int _tmain(int argc, _TCHAR* argv[]) { ////////首先,字串轉換測試//////////////// char* txt = "異度神劍"; cout << "原始字串為:"<< txt << endl << endl; char binary_txt_buf[65]; char_array_2_binary_str(txt,8,binary_txt_buf,64,0); binary_txt_buf[64] = '\0'; cout << "轉化後的二進位制字串為:" << binary_txt_buf << endl << endl; char txt2[9]; char_array_2_binary_str(txt2,8,binary_txt_buf,64,1); txt2[8] = '\0'; cout << "轉化回原始字串為:" <<txt2 << endl << endl; ///////字串轉換測試結束///////////////// ///////檔案轉換測試/////////////////////// const char * filename = "timg.jpg"; const char * filename2 = "timg2.jpg"; ifstream infile(filename,ios::in|ios::binary); if(!infile) abort( ); // 儲存圖片的char陣列空間 char pic_buf[P1LEN]; infile.read(pic_buf,P1LEN); infile.close(); // 轉換成2進位制字串的儲存空間 char ret_buf[P2LEN]; char_array_2_binary_str(pic_buf,P1LEN,ret_buf,P2LEN,0); // 轉換回來 char pic_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,或可期待開個新坑……

相關推薦

圖片(二進位制檔案)儲存資料庫檔案位元組二進位制字串相互轉換

開發中遇到儲存圖片檔案於資料庫這樣的需求。我們知道檔案本身就是一份二進位制資料,不同型別的檔案只是編碼形式不同,對應的解讀形式不同,無論txt檔案、jpg檔案亦或是mp4檔案,本質上都是0和1組成的。而在C++中我們可以通過位元組流來讀寫檔案,也就是說我們可以把檔案讀入cha

SQLserver C#圖片二進位制方式儲存資料庫再從資料庫讀出圖片

一 儲存到資料庫 1、建立資料表UserPhoto  userID為varchar(50)    設定為標識列unique不能重複   alter table UserPhoto add  unique(UserID) &n

PB 如果把PDF 轉換二進位制資料儲存資料庫並讀取顯示

PB如果把PDF檔案轉換成二進位制資料儲存到資料庫,並讀取顯示。 給視窗新增一個PDF的OLE控制元件。 //OLE控制元件關聯檔案 string ls_filepath,ls_filename blob lb_object,ole_blob GetFileOpenName

PHP圖片base64字串相互轉換函式

/** * base64字串轉換成圖片 * @param string $base64_string base64字串 * @param unknown $path 圖片儲存路徑 * @param string $prefix 圖片字首 * @return boolean */ function

指定圖片轉成二進位制陣列以及二進位制陣列儲存資料庫中的方法

      在winform中點選選擇顯示圖片功能,我這邊是用的pictureBox控制元件,現在pictureBox控制元件中的雙擊事件中用以下方法,這邊是使用OpenFileDialog類開啟選擇

檔案儲存資料庫(以二進位制的形式)

Hibernate方法 HibernateUtils.java package yang.fang.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import

smartupload實現 jsp頁面上傳檔案 檔案二進位制形式儲存資料庫

<%@page import="com.sys.utils.DBConnection"%> <%@ page language="java" import="java.sql.*,com.jspsmart.upload.*"%> <jsp:us

本地圖片上傳儲存資料庫(理論上支援各種檔案的上傳)

//取得檔案的具體大小 int doclen = this.File1.PostedFile.ContentLength; //設定快取的具體大小 byte[] docB

SSM框架---上傳多張圖片到專案資料夾內圖片的路徑存到資料庫

資料庫:所存的圖片路徑可以為空,不確定要上傳幾張圖片,圖片id自增 spring配置檔案裡配置檔案上傳解析器  <bean id="multipartResolver" class="org.springframework.web.multipart.commons

java jar包、excel、txt等檔案儲存mysql

首先要注意mysql的欄位型別,可以選擇BLOB型別或text型別,這兩種型別是進行儲存檔案位元組碼的型別; 具體使​​​​​​​用要根據傳入的檔案的大小限制,這裡我們是不能大於16M,所以這裡使用的是 mediumtext型別的欄位; 本次通過儲存檔案的Base64字串

Js動態追加行內容儲存資料庫並取出資料通過js動態顯示

實現步驟講解: 首先需要在html頁面建立一個table表格和一個動態新增行的按鈕 <input type="button" onclick="addT()" value="新增" /> 然後實現表格中追加行的js方法 //新增動態行(可在實現的列中新增相應的滑鼠事

讀取一個二進位制檔案儲存資料庫

//insert into ttt values('2000/12/12') import java.sql.*; import java.io.*; public class  ReadDB{  public static void main(String[] args)

C#照片或圖片轉化為byte[]存入資料庫資料庫中讀照片

publicstaticbyte[] GetBytesByImagePath(string strFile) {byte[] photo_byte =null;using (FileStream fs =new FileStream(strFile, FileMode.Open, FileAcc

Python3.6 讀取txt內容建立資料夾;圖片拷貝至指定資料夾並刪除圖片

 讀取txt內容建立資料夾 # 引入模組 import os #建立資料夾 def mkdir(path): # 去除首位空格 path = path.strip() # 去除尾部 \ 符號 path = path.rstrip("\\")

C#圖片存放到SQL SERVER資料庫中的方法

本文例項講述了C#將圖片存放到SQL SERVER資料庫中的方法。分享給大家供大家參考。具體如下: 第一步:  //獲取當前選擇的圖片 this.pictureBox1.Image = Image.FromStream(this.openFileDialog1.OpenFil

【PHP常見面試題 程式功能設計】先寫一個線上留言本實現使用者的線上留言功能留言資訊儲存資料庫要求書籍資料表內容以及使用PHP編碼完成。

一、考點 1、資料表設計 分析資料表結構 留言板有哪些資訊需要儲存? 留言資訊:ID,留言標題,留言內容,留言時間,留言人 2、資料表建立語句 // 留言本表 message create table message( id int unsign

linux 資料庫操作新增資料庫刪除資料庫sql檔案匯入匯出

匯入sql檔案需要先將sql上傳至伺服器,故連線上xshell後,cd進入到根目錄,再cd進入www(目錄隨意,只要記得自己的sql檔案是匯入到哪個資料夾就可以了) 執行 rz 選擇本地資料庫檔案(rz 是安裝的上傳工具包,具體請移步另外一篇部落格可檢視安裝使用命令),

什麼我的matlab7.0的M檔案儲存不了一點儲存就提示一大堆出錯資訊(顯示的資訊如下)

假如你安裝到D盤,那麼找到d:\matlab7\toolbox\ccslink\ccslink\info.xml 這個檔案,用寫字板開啟這個檔案 ,找到有一行這樣的<name>Link for Code Composer Studio?/name>,把這句的/name>改成</

MongoDB一個基於分散式檔案儲存資料庫(介於關係資料庫和非關係資料庫之間的資料庫

(老外也很看重中國市場啊,知道大家英語不好,做的中文社群) 2:在MongoDB的github上面下載壓縮包上傳到VMware的linux作業系統上面:操作過程就不做多敘述了(使用Xsheel連

MongoDB ----基於分散式檔案儲存資料庫

參考: http://www.cnblogs.com/huangxincheng/category/355399.html http://www.cnblogs.com/daizhj/category/260889.html MongDB是一個高效能,開源,無模式的文件型NosQL資料庫。 主要功能特性