QT接收或发送二进制数据(或数据内包含0)
一般情况下,我们都是采用0作为字符串的结尾,对于初步接触这部分内容的朋友来说是比较复杂的。首先,我们从编译器分配内存开始了解:
当我们调用malloc或new相关函数分配内存时,编译器在分配出的地址( 比如0x00221290 )前16个字节中记录这块内存的相关信息(在VS2010编译器中测试出的结果)。
举个简单例子:
char *str = new char[128];
通过这句代码我们分配出128个字节连续内存,这段内存的首地址比如是0x00221290,在它的地址前16个字节(0x00221280)处可以看到当前分配的字节数,它每四个字节记录一种信息,编译器应该是通过这种方式管理动态内存(根据在VS2010中的测试,发现到字节匹配信息后,上网搜索资料,搜到了关于前16个字节描述文章,链接地址:https://www.cnblogs.com/littlejohnny/p/4846361.html)。
当然上面这种方式只能用来理解内存的分配,不能用到实际使用过程中。
回归正题,在我们不确定字符串中是否包含0的情况下可以通过控制字符串长度达到实际使用效果,下面描述实际使用方式:
使用QString相关类型保存字符串时,如果字符串中存在0表示,我们可以使用这种方式记录:
char *str = new char[128];
memcpy(str,"test",strlen("test"));
int nLen = strlen("test");
*(str + nLen) = 0;
++nLen;
memcpy(str + nLen,"oo",strlen("oo"));
nLen += strlen("oo");
*(str + nLen) = 0;
++nLen;
QString::fromStdString(std::string(str,sizeof(char) * 128));
delete[] str,str =0;
在上述代码中 int nLen = strlen("test");,使用了strlen("test")而不是strlen(str),因为我们动态分配的内存是不干净的,我们赋值的地址与后面的脏内存会一起计算,使用strlen得到的数据会比实际想要得到的大很多。如果必须使用strlen(str)这种方式,需要在我们使用前初始化这段内存。
在QT中QByteArray类型专门用来存储二进制数据使用,调用某些模块方法需要使用二进制发送时可以使用这种类型,使用方式:
char *str = new char[128];
memcpy(str,"test",strlen("test"));
int nLen = strlen("test");
*(str + nLen) = 0;
++nLen;
memcpy(str + nLen,"oo",strlen("oo"));
nLen += strlen("oo");
*(str + nLen) = 0;
++nLen;
QByteArray byte(str,sizeof(char) * 128);
delete[] str,str =0;
使用动态内存需要注意的地方远不止这些,合理使用(不减少编写步骤),才能避免内存异常情况。
QT接收或发送二进制数据(或数据内包含0)相关推荐
- python3.6串口编程实例_Python3 串口接收与发送16进制数据包的实例
Python3 串口接收与发送16进制数据包的实例 如下所示: import serial import string import binascii s=serial.Serial('com4',9 ...
- 前端如何接收 websocket 发送过来的实时数据
https://www.cnblogs.com/goloving/p/9108462.html
- 如何在Node.js的httpServer中接收前端发送的arraybuffer数据
最近使用了protobuf进行数据交互,发送在node.js接收前端的二进制数据出现了数据错误等问题.后来发现思路上面的问题,在req.on('data',()=>{})事件中的处理不适当才引发 ...
- android 上传文件到 c 服务器,android 怎么样用socket给C服务器 发送二进制数据
最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00 ...
- 使用Qt通过Post发送Json格式数据
一.简介 1.任务目标 使用Qt通过post发送Json格式数据,或者以表单形式发送数据到服务器 2.环境简介 系统:Windows 10 Qt版本:5.7 二.内容准备 1.关于Qt 1.使用Pos ...
- Android客户端通过TCP接收服务器端发送的数据
引言 因为我确实不懂TCP通信这一块儿,最近项目中要实现客户端接收服务器端发送过来的数据(这个数据是int型的,范围是0~360,而且服务器端用C语言写的,每一秒发送一次,客户端只需要不断接收就好了) ...
- qt使用https发送数据遇到的段错误--未解决
问题环境描述: uos系统,amd64的cpu,V20版本,在其他系统上,同样的代码,没有报该错误,到了该平台上则出现了段错误.报错信息如下,猜测:应该是多次释放造成的 #0 0x00007f58ce ...
- 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送
说明:苹果官方开发文档中涉及一些名词:Central(中心设备).Peripheral(外围设备).advertising(广告).Services(服务).Characteristic(特征)等,请 ...
- qt定时连续发送udp数据包_TCP和UDP
首先强调一点,TCP/IP协议是一个协议簇.里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP.IP协议是两个很重要的协议,就用他两命名了. 两个协议的区别实际使用时 ...
最新文章
- linux实现时间服务器视频,linux实现时间同步有哪几种方法
- 【CentOS】如何在线安装pcre?
- 64位ubuntu16.04下pycharm无法切换fcitx输入法和无法输入中文的问题
- Wordpress基础:精简头部wp_head
- Java 语言实现的 I/O 模型
- Deep learning:十(PCA和whitening)
- 性能测试之JMeter测试结果写入Excel
- Android学习笔记--文件下载和SD卡的使用
- 用PBD制作餐饮店KPI分析仪-入门篇
- 冒泡排序c++_学习笔记-详解冒泡排序
- java毕设项目开源了,springboot+vue的应用级erp系统
- C# 合并Excel工作表
- 论坛勋章动态特效制作流程
- 报错:Container killed by YARN for exceeding memory limits
- mysql的七种查询命令_MySQL数据库查询指令大全
- Classic Shell 4.2.4 中文版已经发布
- Kubernetes--学习笔记-3-Kubernetes Web UI部署
- Dijkstra最优路径的算法
- 牛逼,手机居然可以无线投屏到笔记本电脑!
- python 占位符(百分号方式、Format 方式)
热门文章
- 图解Kafka中的基本概念
- 漫画:凌晨2点,老板在工作群@了我...
- 探秘蚂蚁金服分布式事务 Seata 的AT、Saga和TCC模式
- Linux下几种文件传输命令 sz rz sftp scp
- 数据源管理 | PostgreSQL环境整合,JSON类型应用
- Linux网络设置(第二版) --Linux网络设置
- hadoop--Yarn资源调度器的基础架构、工作机制 与 作业提交全过程
- Redis分布式基础主从同步
- 职责链模式(Chain of Responsibility Pattern)
- Linq语言集成查询