QByteArray

The QByteArray class provides an array of bytes.

Qt 手册中描述 QByteArray字节数组 ,即是一个数组,里面保存字节。

Qt 中,QByteArray一般用于数据的传输,因为经常需要将其他类型的数据转换成 QByteArray,可以使用它的 append() 方法将字节一个一个的插入到数据中。

方法声明如下:

  1. QByteArray& append(char ch);

append() 有多个重载,但是只有这个是一个字节一个字节地插入。

整型 <==> QByteArray

以x86平台的int型为例,int占4位,转换后QByteArray大小应该为4,QByteArray大小决定了存储的数据的范围

遍历 int型 数据的四个字节,将每个字节的数据单独提取出来

  1. static int andArray[4] = {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000};
  2. QByteArray Int2Byte(int int_data, int bits)
  3. {
  4. QByteArray byte_data;
  5. bits = (bits > 4 || bits <= 0)? 4: bits;//1/2/3/4
  6. for(int index = 0; index < bits; index++)
  7. {
  8. int offset = index * 8;
  9. byte_data.append((char) ((andArray[index] & int_data) >> offset));
  10. }
  11. return byte_data;
  12. }
  13. int Byte2Int(QByteArray bytes)
  14. {
  15. int addr = bytes[0] & 0x000000FF;
  16. addr |= ((bytes[1] << 8) & 0x0000FF00);
  17. addr |= ((bytes[2] << 16) & 0x00FF0000);
  18. addr |= ((bytes[3] << 24) & 0xFF000000);
  19. return addr;
  20. }

说明:

  • data & 0x0000FF00 可以保留低二位的数据,清楚其他位数据;
  • data >> 4 向右偏移 4 位,新增位置 0,可以将低二位变为低一位;
  • a |= ba = a|b,这里偏移之后,将新位置数据合并起来;
  • byteintintbyte 操作相反,并使用 |= 进行数据位拼接;

注意:

在进行转换的时候需要考虑到低位和高位的问题,示例代码从 int 数据的低位开始取数,所以 QByteArray 中的数据的第一位是 int 的最低位,关于从低位到高位,还是高位到地位,需要和调用方商量好。

浮点型 <==> QByteArray

以x86平台的float型为例,float占4位,转换后QByteArray大小应该为4,QByteArray大小决定了存储的数据的范围

数据传输中,可以将浮点型乘以一定的倍数,转换成整型传输,也可以不乘,这里使用直接转换的方法

关于浮点数在内存中的存储方式,请参考相关文章,这里不作详细描述,总而言之,浮点数和整型数在内存中是相似的,所以只要将浮点数的内存中的内容直接转换即可

  1. QByteArray Float2Byte(float data)
  2. {
  3. QByteArray byte_data;
  4. char* data_char = (char*)&data;
  5. for(int index = 3; index >= 0; index--)
  6. {
  7. byte_data.append(data_char[index]);
  8. }
  9. return byte_data;
  10. }
  11. float Byte2Float(QByteArray byte)
  12. {
  13. float result = 0;
  14. int size = byte.size();
  15. char* data_char = byte.data();
  16. char* p = (char*)&result;
  17. for(int index = 0; index < size; index++)
  18. {
  19. *(p + index) = *(data_char + size - 1 - index);
  20. }
  21. return result;
  22. }

说明:

  • 使用 char* 指针直接指向 float 数据的内存地址,并使用指针取出地址内容;
  • 同样的,反向转换的时候,还是用指针将数据直接保存进内容中;

注意:

这里仍然要考虑高位和低位的问题,示例代码 floatQByteArray 中,从高位开始,所以转换后的QByteArray 的第一位是最高位,关于从低位到高位,还是高位到地位,需要和调用方商量好。

整型和浮点型与QByteArray的转换的更多相关文章

  1. Swift数据类型_整型和浮点型

    //swift中的整型和浮点型 /** * //类型推断整数是Int 浮点数是Double ,日常使用需要注意不能越界,存储时间毫秒数 英雄经验数等等之类内容容易越界 整型 大多数情况下,你不需要在代 ...

  2. 《从零开始学Swift》学习笔记(Day 13)——数据类型之整型和浮点型

    Swift 2.0学习笔记(Day 13)——数据类型之整型和浮点型 原创文章,欢迎转载.转载请注明:关东升的博客    Swift提供8.16.32.64位形式的有符号及无符号整数.这些整数类型遵循 ...

  3. python基本数据类型之整型和浮点型

    python基本数据类型之数字与浮点型 在python3中,整数的数据类型为int,而浮点数的数据类型为float.python2中整数可以是int和long(长整型)两种类型,python3只保留了 ...

  4. go语言数据类型值--整型和浮点型

    一.整型 1.整型的分类: 有符号整型: int8.int16.int32.int64 对应的无符号整型: uint8.uint16.uint32.uint64 uint就是我们熟知的byte类型,i ...

  5. Swift数据类型之整型和浮点型-备

    Swift提供8.16.32.64位形式的有符号及无符号整数.这些整数类型遵循C语言的命名规约,我归纳了Swift中的整型: 整型示例: print("UInt8 range: \(UInt ...

  6. 以php中的比较运算符操作整型,浮点型,字符串型,布尔型和空类型

    字符,数字,特殊符号的比较依赖ASC II表,本表原先有127个,后来又扩充了一些,里面包含了奇奇奇怪的符号. ASC II表 https://baike.baidu.com/item/ASCII/3 ...

  7. 老贾的幸福生活day6 整型和布尔值的转换 字符串讲解 for 循环简介

    整型和布尔值的转换: 整型: python 2 整型 int long(长整型) /获取的是整型 python 3 整型 int 获取的是浮点数(小数) 十进制转二进制: print(bin(36)) ...

  8. Python基本数据类型之整型和布尔型

    整型和布尔型 获取对象的数据类型 1.type() 2.dir() 3.help() 4.在pycharm里面的操作 数字类型 int 创建: int() 接收数字字符串 .bit_lenght() ...

  9. Java - 一道关于整型和字符类型相加的题目

    题目 public class Test { public static void main(final String[] args) { final int a = 10; final int b ...

随机推荐

  1. PAS

    一.概念 二.安装 打开Delphi,在主菜单上选择Component,单击Install Component,出现图所示的对话框.有两个选择,装到已经存在的包里面和装到新的包里面.我们选择后者,单击 ...

  2. Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。

    实际使用中,经常需要使用不同精确度的Date,比如保留到天 2020-04-23 00:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyy-MM-dd) ...

  3. python-用户输入和while循环

    函数input() 比较大小要同类型: age=iput() 21 age=int(age) age>=10 true prompt = "If you tell us who you ...

  4. mybatis源码学习:一级缓存和二级缓存分析

    目录 零.一级缓存和二级缓存的流程 一级缓存总结 二级缓存总结 一.缓存接口Cache及其实现类 二.cache标签解析源码 三.CacheKey缓存项的key 四.二级缓存TransactionCa ...

  5. LDA概率主题模型

    目录 LDA 主题模型 几个重要分布 模型 Unigram model Mixture of unigrams model PLSA模型 LDA 怎么确定LDA的topic个数? 如何用主题模型解决推 ...

  6. vector做形参时的三种传参方式

    vector在做形参的时候传参的方式和普通的变量是一样的,要么传值.要么传引用.要么传指针. 现在分别定义三个以vector为形参的函数: (1) fun1(vector <int> v) ...

  7. ajax 报0错误

    本以为在本地测试不会跨越,结果检查下来就是跨域的问题!!!! 来源:https://www.cnblogs.com/xiezn/p/5651093.html PHP Ajax 跨域问题最佳解决方案   ...

  8. ansible的清单管理与模块应用(三)

  9. QtConcurrent::run() 只能运行参数个数不超过5的函数

    有时不得不看源码 qtconcurrentrun.h template <typename T, typename Param1, typename Arg1, typename Param2, ...

  10. qt tableview 选择模式

    QAbstractItemView::SingleSelection QAbstractItemView::ContiguousSelection QAbstractItemView::Extende ...