一般情况下,我们都是采用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)相关推荐

  1. python3.6串口编程实例_Python3 串口接收与发送16进制数据包的实例

    Python3 串口接收与发送16进制数据包的实例 如下所示: import serial import string import binascii s=serial.Serial('com4',9 ...

  2. 前端如何接收 websocket 发送过来的实时数据

    https://www.cnblogs.com/goloving/p/9108462.html

  3. 如何在Node.js的httpServer中接收前端发送的arraybuffer数据

    最近使用了protobuf进行数据交互,发送在node.js接收前端的二进制数据出现了数据错误等问题.后来发现思路上面的问题,在req.on('data',()=>{})事件中的处理不适当才引发 ...

  4. android 上传文件到 c 服务器,android 怎么样用socket给C服务器 发送二进制数据

    最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00 ...

  5. 使用Qt通过Post发送Json格式数据

    一.简介 1.任务目标 使用Qt通过post发送Json格式数据,或者以表单形式发送数据到服务器 2.环境简介 系统:Windows 10 Qt版本:5.7 二.内容准备 1.关于Qt 1.使用Pos ...

  6. Android客户端通过TCP接收服务器端发送的数据

    引言 因为我确实不懂TCP通信这一块儿,最近项目中要实现客户端接收服务器端发送过来的数据(这个数据是int型的,范围是0~360,而且服务器端用C语言写的,每一秒发送一次,客户端只需要不断接收就好了) ...

  7. qt使用https发送数据遇到的段错误--未解决

    问题环境描述: uos系统,amd64的cpu,V20版本,在其他系统上,同样的代码,没有报该错误,到了该平台上则出现了段错误.报错信息如下,猜测:应该是多次释放造成的 #0 0x00007f58ce ...

  8. 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送

    说明:苹果官方开发文档中涉及一些名词:Central(中心设备).Peripheral(外围设备).advertising(广告).Services(服务).Characteristic(特征)等,请 ...

  9. qt定时连续发送udp数据包_TCP和UDP

    首先强调一点,TCP/IP协议是一个协议簇.里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP.IP协议是两个很重要的协议,就用他两命名了. 两个协议的区别实际使用时 ...

最新文章

  1. linux实现时间服务器视频,linux实现时间同步有哪几种方法
  2. 【CentOS】如何在线安装pcre?
  3. 64位ubuntu16.04下pycharm无法切换fcitx输入法和无法输入中文的问题
  4. Wordpress基础:精简头部wp_head
  5. Java 语言实现的 I/O 模型
  6. Deep learning:十(PCA和whitening)
  7. 性能测试之JMeter测试结果写入Excel
  8. Android学习笔记--文件下载和SD卡的使用
  9. 用PBD制作餐饮店KPI分析仪-入门篇
  10. 冒泡排序c++_学习笔记-详解冒泡排序
  11. java毕设项目开源了,springboot+vue的应用级erp系统
  12. C# 合并Excel工作表
  13. 论坛勋章动态特效制作流程
  14. 报错:Container killed by YARN for exceeding memory limits
  15. mysql的七种查询命令_MySQL数据库查询指令大全
  16. Classic Shell 4.2.4 中文版已经发布
  17. Kubernetes--学习笔记-3-Kubernetes Web UI部署
  18. Dijkstra最优路径的算法
  19. 牛逼,手机居然可以无线投屏到笔记本电脑!
  20. python 占位符(百分号方式、Format 方式)

热门文章

  1. 图解Kafka中的基本概念
  2. 漫画:凌晨2点,老板在工作群@了我...
  3. 探秘蚂蚁金服分布式事务 Seata 的AT、Saga和TCC模式
  4. Linux下几种文件传输命令 sz rz sftp scp
  5. 数据源管理 | PostgreSQL环境整合,JSON类型应用
  6. Linux网络设置(第二版) --Linux网络设置
  7. hadoop--Yarn资源调度器的基础架构、工作机制 与 作业提交全过程
  8. Redis分布式基础主从同步
  9. 职责链模式(Chain of Responsibility Pattern)
  10. Linq语言集成查询