如何存储包含null的二进制数据

haoahui 2010-04-02 03:17:37
// 开辟一块内存
BYTE *tmp=NULL, *tmp1;
tmp = malloc( 560);
// 给上述内存块赋值(二进制),存在其中某些内存空间不被赋值(null)的情况,且个数与位置都不固定
某函数(tmp);

现在要将tmp内存中二进制数据(包括其中的null)保存到数据库(sqlite3)中, 如何处理

开发环境:
OS:linux
语言:C语言
硬件:OMP3530

在线等您回答
...全文
281 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
haoahui 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 vivo01 的回复:]

你要保存的值除了null以外如果都是正数或0的话,那你可以将null的值用一个宏替换,比如一个负值
#define NULL -1
读取的时候如果是-1就判断为空值
[/Quote]这种办法行不通 -1就是255啊。。。
comeon010 2010-04-02
  • 打赏
  • 举报
回复
把所有的数据进行一个异或存入,读出后再异或回来。
a^0xcc
haoahui 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 vivo01 的回复:]

你要保存的值除了null以外如果都是正数或0的话,那你可以将null的值用一个宏替换,比如一个负值
#define NULL -1
读取的时候如果是-1就判断为空值
[/Quote]我试试
亦枫Leonlew 2010-04-02
  • 打赏
  • 举报
回复
你要保存的值除了null以外如果都是正数或0的话,那你可以将null的值用一个宏替换,比如一个负值
#define NULL -1
读取的时候如果是-1就判断为空值
haoahui 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 toborac 的回复:]

不要用 strxxx 那一组函数 用memxxx那一组
[/Quote]我没用strXXX 都是指定的长度
haoahui 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 loaden 的回复:]

比如:
BYTE *tmp=NULL, *tmp1;
tmp = malloc( 560);

你申请的内存大小是560,那么,刚才的那个长度也指定:560 就可以将数据都写进去了。
[/Quote]sqlite3_bind_blob(stat, 1, fvModule, 560, NULL);这是我的代码 没用的。。。
老邓 2010-04-02
  • 打赏
  • 举报
回复
比如:
BYTE *tmp=NULL, *tmp1;
tmp = malloc( 560);

你申请的内存大小是560,那么,刚才的那个长度也指定:560 就可以将数据都写进去了。
老邓 2010-04-02
  • 打赏
  • 举报
回复
sqlite3_bind_blob( stat, 1, buffer, strlen(buffer), NULL );

红色处不可用strlen,因为遇到null就截断了。
要自己指定一个长度。
haoahui 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cattycat 的回复:]

数据库中有个字段能保存二进制信息,你BYTE的直接写进数据库就行,只要你记得长度就行。这个字段不能是char类型。
你说的null值就是0吧。
[/Quote]读到null就会停止了。。。
haoahui 2010-04-02
  • 打赏
  • 举报
回复
谢谢各位以上的回答 我数据库里字段的类型是BLOB 也是用sqlite3_bind_blob来做的 但null后面的数据不会被存入数据库 怎么办!!!
toborac 2010-04-02
  • 打赏
  • 举报
回复
不要用 strxxx 那一组函数 用memxxx那一组
wesleyluo 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cattycat 的回复:]

数据库中有个字段能保存二进制信息,你BYTE的直接写进数据库就行,只要你记得长度就行。这个字段不能是char类型。
你说的null值就是0吧。
[/Quote]
同意,你不用管内存中是什么数据,只要你知道长度 N,然后往文件中写入内存的N个空间就行咯。
老邓 2010-04-02
  • 打赏
  • 举报
回复
http://www.xue5.com/itedu/200707/118810.html

写二进制数据

sqlite3 * db;

int result;

char **errmsg =NULL;

result = sqlite3_open("test.db", &db );

if( result != SQLITE_OK )

{ return -1;}

result = sqlite3_exec( db,"create table tb( ID integer, content blob)", NULL, NULL, errmsg);

if(result != SQLITE_OK){printf("erro");}



char *buffer;//要写的二进内容,也可以从文件读出来

buffer=new char[1024*1024];

for(int i=0;i<1024*1024;i++)buffer[i]='a';



sqlite3_stmt *stat;//写二进制数据时要用的结构

sqlite3_prepare( db, "insert into tb( ID, content) values( 10, ? )", -1, &stat, 0 );//准备插入数据

sqlite3_bind_blob( stat, 1, buffer, strlen(buffer), NULL ); //把内容和字段绑定

result=sqlite3_step( stat );//执行

sqlite3_finalize( stat );释放内存

sqlite3_close( db );
cattycat 2010-04-02
  • 打赏
  • 举报
回复
数据库中有个字段能保存二进制信息,你BYTE的直接写进数据库就行,只要你记得长度就行。这个字段不能是char类型。
你说的null值就是0吧。
haoahui 2010-04-02
  • 打赏
  • 举报
回复
大家帮帮我 头痛死了 明天不想加班啊
haoahui 2010-04-02
  • 打赏
  • 举报
回复
这样,
比如有个相机,我写了个驱动,相机拍摄,然后模数转换成二进制 这里的tmp接收这些二进制数据,
问题是这个tmp中的数据不是连续的 比如说着个tmp长度为3,第一块内存空间里是1,第二块内存空间里是null,低三块空间里是0 也就是说 tmp 1 null 0 现在我要把1 null 0 这个模型数据保存到sqlite3中 在保存的过程中 遇到null 就认为数据结束了 只能把1保存到数据库中
haoahui 2010-04-02
  • 打赏
  • 举报
回复
类型为BYTE ,自己定义的 typedef unsigned char BYTE;
jbz001 2010-04-02
  • 打赏
  • 举报
回复
还有,你的意思我没看明白
jbz001 2010-04-02
  • 打赏
  • 举报
回复
申请动态内存时没有指定数据类型

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧