SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介

        Blob(Binary Large Object)是一种用于存储二进制数据的数据类型,在数据库中常用于存储图片、音频和视频等大型(大数据量)的二进制数据[1-2]。需要注意的是,SQLite中BLOB类型的单对象最大存储字节数由预处理器宏SQLITE_MAX_LENGTH定义并可以提高或降低该值,但是当前的实现只支持最大长度为2^{31}-1字节。

        在SQLite的部分INSERT和SELECT语句处理过程中,数据库中每一行的完整内容被编码为单个BLOB数据类型对象,所以SQLITE_MAX_LENGTH宏定义决定了数据库中一行的最大字节数[3]

二、C++标准库之bitset简介[4-6]

       C++标准库中的bitset库,是一个模板类(模板参数定义了位集合的大小)且提供了一种方式来操作固定大小的位集合。位集合是一个由位(bit)组成的数组,每个位可以是0或1,因此bitset类型非常适合于需要表示二进制数据或进行位操作的场景。

        位运算的优势在于可以大量减少运行开销,优化算法。其运算速度快的原因是直接使用计算机底层的二进制机器操作指令。较为详细的位运算理论理解与实际用例可参考资料[6]。

二、C++中基本数据类型实例与其二进制存储形式探索[7-10]

        计算机中的所有数据,无论是文本、图像、音频还是视频,最终都会被转换为二进制形式进行存储和处理。比特/位(bit)是计算机内存中的最小/原子单位,也是数据传输的最小单位;字节(Byte)是计算机系统中最小的存储单位,是计算机记忆体(memory)存储资料的基本单位,每个字节由八个比特位组成。

       C++基本内置数据类型在计算机内部存储数据时使用二进制,但在向用户显示时使用八进制、十进制与十六进制等进制。需要注意的是,整数类型是按照二进制补码的方式来存储数值(非负整数直接使用二进制表示,无符号位),其最高位(最左边一位)用于表示符号(0表示正数,1表示负数),剩下的位数表示数值部分;浮点数类型是按照IEEE 754标准来存储数据,然后根据浮点数数值转换公式进行数值计算。详细叙述可参考资料[7]。

        计算机中的字符按照字符集编码表示,常见的字符集编码有ASCII编码、ANSI编码、Unicode编码以及UTF-8编码。其中,ASCII码(American Standard Code for Information Interchange,美国信息交换标准码),一个英文字母(不分大小写)占一个字节的空间。ASCII码字符代码表可参考资料[10]。

        (一)实验一 基于字符串的逐字符二进制编码转换

        (二)实验二 长整型向量的逐一元素二进制编码转换

        (三)实验三 字符型向量的逐一元素二进制编码转换

实验总结:

1. C++基本内置数据类型在计算机内部存储数据时使用二进制;

2. 基于标准库bitset可以将存储数据以二进制的形式显化展示;

3. 字符类型(char)占一个字节,其不仅可以基于ASCII码存储字符,还可以在单字节限制下存储有限大小的整型数据(实质上,char与int之间存在隐式转换)。

三、基于SQLite实现图像数据库管理(图像的存取实例)[11-12]

        该示例代码仅实现了图像数据的数据库/表创建及数据插入,未实现数据库图像的读取与二进制码解析。数据库图像的读取与二进制码解析概要代码可参考资料[12]。

#include <iostream>
#include <string>
#include <vector>
#include "opencv2/opencv.hpp"
#include "sqlite3.h"using namespace std;// 实验数据
string imagePath = "./icon.jpg";int main()
{// 读取图像文件并检查图像是否读取成功cv::Mat image = cv::imread(imagePath);if (image.empty()) {cout << "无法读取图像文件。" << endl;return -1;}// 创建图像存储表/*图像存储表设计(该表包含"id"、"name"、"size"、"type"、"data"五个字段):1. "id"字段作为主键,自动递增;2. "name"字段用于存储图像的名称;3. "size"字段用于存储图像的大小(以字节为单位);4. "type"用于存储图像的类型(如.jpg和.png等);5. "data"字段为BLOB类型,用于存储图像的二进制类型*/sqlite3* db;int rc = sqlite3_open("./imageDB.db", &db);if (rc){std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;return 1;}else{std::cout << "数据库打开成功" << std::endl;}// 创建数据库表char* errMsg = 0;const char* sql = "CREATE TABLE IF NOT EXISTS images""(id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""size INTEGER NOT NULL,""type TEXT NOT NULL,""data BLOB);";rc = sqlite3_exec(db, sql, 0, 0, &errMsg);if (rc != SQLITE_OK){std::cerr << "SQL错误: " << errMsg << std::endl;sqlite3_free(errMsg);sqlite3_close(db);return -1;}else{std::cout << "表创建成功" << std::endl;}// 处理图像数据(将图像数据转换为二进制数据)vector<uchar> buffer;cv::imencode(".jpg", image, buffer);  // 该函数将图像以设定图片格式编码存储到buffer// 该函数将图像数据编码转换为指定格式的字节流,这个字节流本质上就是二进制数据size_t size = sizeof(buffer);uchar* dataPtr = buffer.data();// 基于参数化方式将图像数据存入表/*参数化方式的原理:参数化将SQL语句的结构与数据分开。SQL语句中的参数位置用?占位符表示,然后通过专门的绑定函数将实际数据绑定到这些占位符上。参数化方式的优势:这样可以有效避免SQL注入攻击。因为SQL语句的语法结构是固定的,用户输入的数据不会被解释为SQL语法的一部分*/const char* sql1 = "INSERT INTO images (id,name,size,type,data)""VALUES (?, ?, ?, ?, ?);";sqlite3_stmt* stmt;int rc1 = sqlite3_prepare_v2(db, sql1, -1, &stmt, nullptr);if (rc1 != SQLITE_OK) {std::cerr << "准备插入语句出错: " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);return -1;}sqlite3_bind_int(stmt, 1, 0);sqlite3_bind_text(stmt, 2, "icon", -1, SQLITE_TRANSIENT);sqlite3_bind_int(stmt, 3, size);sqlite3_bind_text(stmt, 4, "jpg", -1, SQLITE_TRANSIENT);sqlite3_bind_blob(stmt, 5, dataPtr, -1, SQLITE_TRANSIENT);int rc2 = sqlite3_step(stmt);if (rc2 != SQLITE_DONE) {std::cerr << "执行插入语句出错: " << sqlite3_errmsg(db) << std::endl;}cout << "图像数据插入成功" << endl;sqlite3_finalize(stmt);return 0;
}

参考资料:

[1] Datatypes In SQLite

[2] SQLite Blob 数据类型详解|极客笔记 (deepinout.com)

[3] SQLite 的实现限制 | SQLite中文网 (readdevdocs.com)

[4] C++ 数据类型 | 菜鸟教程 (runoob.com)

[5] C++之std::bitset使用精讲(全)-CSDN博客

[6] 位运算的运用场景使用总结_位运算的使用场景-CSDN博客

[7] C++内置数据类型与二进制存储 | 我有昕想法 | Peter_Matthew的博客 (zhangkai.xin)

[8] 计算机科学导论:第三章 数据存储 - 知乎 (zhihu.com)

[9] 在 C++ 中将字符串转换为二进制序列 | D栈 - Delft Stack

[10] ASCII 表 | 菜鸟教程 (runoob.com)

[11] SQLite 数据库中插入和读取 BLOB 数据|极客笔记 (deepinout.com)

[12] SQLite 如何在SQLite数据库中存储图像|极客教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写一个基于React的聊天室

前言 此前已经编写了一版后端的im&#xff0c;此次就用其作为服务端&#xff0c;可查看参考资料1 代码 使用WebStorm创建React项目 安装依赖包 PS C:\learn-demo\front\chatroom> npm installadded 183 packages, and audited 184 packages in 16s43 packages are looki…

Javascript事件循环流程分析

基础概念 事件循环&#xff08;Event Loop&#xff09;&#xff1a;事件循环是JavaScript运行时环境中的一个循环机制&#xff0c;它不断地检查调栈用和任务队列。当调用栈为空时&#xff0c;事件循环会首先检查微任务队列&#xff0c;并执行其中的所有任务。只有当微任务队列…

解决使用Golang的email库发送qq邮件报错short response,错误类型为textproto.ProtocolError

问题阐述 使用email库发送QQ邮件&#xff0c;采用587端口&#xff1a; package mainimport ("fmt""net/smtp""github.com/jordan-wright/email" )func SendEmail(sendTo string, subject string, body string) (err error) {e : email.NewEmai…

题目:Wangzyy的卡牌游戏

登录 - XYOJ 思路&#xff1a; 使用动态规划&#xff0c;设dp[n]表示当前数字之和模三等于0的组合数。 状态转移方程&#xff1a;因为是模三&#xff0c;所以和的可能就只有0、1、2。等号右边的f和dp都表示当前一轮模三等于k的组合数。以第一行为例&#xff1a;等号右边表示 j转…

【支付行业-支付系统架构及总结】

记得第一次看埃隆马斯克&#xff08;Elon Musk&#xff09;讲第一性原理的视频时&#xff0c;深受震撼&#xff0c;原来还可以这样处理复杂的事务。这篇文章也尝试化繁为简&#xff0c;探寻支付系统的本质&#xff0c;讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付…

模块化沙箱:深信达如何为数据安全提供全方位保护

在数字化时代&#xff0c;网络安全已经成为企业和个人不可忽视的重要议题。随着网络攻击手段的日益复杂和多样化&#xff0c;传统的安全防护措施已经难以应对日益严峻的安全挑战。在这样的背景下&#xff0c;模块化沙箱技术应运而生&#xff0c;成为网络安全领域的新宠。今天&a…

基于单片机的观赏类水草养殖智能控制系统的设计(论文+源码)

1总体设计 通过需求分析&#xff0c;本设计观赏类水草养殖智能控制系统的总体架构如图2.1所示&#xff0c;为系统总体设计框图。系统采用STM32单片机作为系统主控核心&#xff0c;利用DS18B20温度传感器、TDS传感器、CO2传感器、光敏传感器实现水草养殖环境中水温、CO2浓度、T…

基于Jeecgboot3.6.3vue3的flowable流程增加online表单的审批支持(四)online表单字段控制

更多技术支持与服务请加入我的知识星球或加我微信,名称:亿事达nbcio技术交流社区https://t.zsxq.com/iPi8F 1、首先需要配置操作规则,如下: 配置这个节点的一些字段属性,上面就是有两个隐藏了,一个可以编辑,上面的规则采用json格式保存到数据库里 2、取出这些规则 //根…

分享:文本转换工具:PDF转图片,WORD转PDF,WORD转图片

前言 鉴于网上大多数在线转换工具要么需要收费&#xff0c;要么免费后但转换质量极差的情况&#xff0c;本人开发并提供了PDF转图片&#xff0c;WORD转PDF&#xff0c;WORD转图片等的文本转换工具。 地址 http://8.134.236.93/entry/login 账号 账号&#xff1a;STAR001&a…

星环大数据平台--TDH部署

1.1 准备一台虚拟机 正常安装一台新的虚拟机&#xff0c; 内存16G&#xff0c;cpu8核&#xff0c;硬盘50G 1.2 安装前系统配置改动 修改/etc/hosts文件&#xff0c;确保hostname该文件包含节点的hostname和IP地址的映射关系列表。 hostname由数字、小写字母或“-”组成&am…

Visual Studio2022版本的下载与安装

1-首先打开微软的官网&#xff0c;下面就是链接 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux免费下载 Visual Studio IDE 或 VS Code。 在 Windows、Mac 上试用 Visual Studio Professional 或企业版。https://visualstudio.microsoft.com/zh-hans/downloads/?…

如何去除图片水印?快来试试这4种图片去水印方法!

去除图片水印是一项普遍存在的图像处理需求&#xff0c;它旨在消除水印对图片视觉效果的干扰&#xff0c;让我们能够更自由、更美观、更专业地使用图片资源。接下来&#xff0c;我们将介绍四种有效的去除图片水印的方法和工具&#xff0c;它们各自具有独特的优势和适用场景。 方…

A day a tweet(sixteen)——The better way of search of ChatGPT

Introducing ChatGPT search a/ad.及时的/及时地 ChatGPT can now search the web in a much better way than before so you get fast, timely a.有关的(relative n.亲戚,亲属;同类事物 a.比较的&#xff1b;相对的) answers with link…

selenium+chromedriver下载与安装

安装selenium 使用pip安装selenium&#xff1a; pip install selenium安装成功&#xff1a; 安装WebDriver 根据你使用的浏览器下载相应的 WebDriver。 Chrome&#xff1a;下载地址Firefox&#xff1a;下载地址Edge&#xff1a;下载地址Safari&#xff1a;下载地址 1、c…

跨子网的WinCC客户机/服务器如何实现通讯?

为了更有效地利用有限的IP地址&#xff0c;为了减少广播对网络带宽的占用从而提高带宽&#xff0c;为了实现在不同子网中应用不同的安全策略从而提高网络安全性&#xff0c;现场通常要求划分子网&#xff0c;将安全等级要求不同的计算机安置在不同的子网中&#xff0c;分开管理…

Docker部署Oracle 11g

1&#xff0c;拉取镜像&#xff1a; sudo docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11gsudo docker images 2&#xff0c;启动一个临时容器&#xff0c;用于拷贝数据库文件&#xff0c;挂载到宿主主机&#xff0c;使数据持久化&#xff1a; sudo docke…

中安OCR电子行驶证、驾驶证识别,助力便捷出行与智慧交通

随着数字化技术在各行各业的深入应用&#xff0c;交通管理领域也迈入了新的时代。OCR电子行驶证和电子驾驶证的推出&#xff0c;不仅提升了车辆及驾驶证件管理的效率&#xff0c;更大大方便了车主出行。电子证件的普及&#xff0c;使得交通管理从“实体化”逐渐走向“数字化”&…

[CKS] K8S ServiceAccount Set Up

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于Rolebinding的题目。 Question 1 The buffy Pod in the sunnydale namespace has a buffy-sa ServiceAccount with permissions the Pod doesn’t need. Modify the attached Role so that it onl…

如何找到系统中bert-base-uncased默认安装位置

问题&#xff1a; 服务器中无法连接huggingface&#xff0c;故需要自己将模型文件上传 ubuntu 可以按照这个链接下载 Bert下载和使用&#xff08;以bert-base-uncased为例&#xff09; - 会自愈的哈士奇 - 博客园 里面提供了giehub里面的链接 GitHub - google-research/be…

.NET 黑名单上传 突破WAF防护的SoapShell (免杀版)

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…