整型和浮点型与QByteArray的转换
QByteArray
The QByteArray class provides an array of bytes.
Qt 手册中描述 QByteArray 为 字节数组 ,即是一个数组,里面保存字节。
在 Qt 中,QByteArray一般用于数据的传输,因为经常需要将其他类型的数据转换成 QByteArray,可以使用它的 append() 方法将字节一个一个的插入到数据中。
方法声明如下:
QByteArray& append(char ch);
append() 有多个重载,但是只有这个是一个字节一个字节地插入。
整型 <==> QByteArray
以x86平台的int型为例,int占4位,转换后QByteArray大小应该为4,QByteArray大小决定了存储的数据的范围
遍历 int型 数据的四个字节,将每个字节的数据单独提取出来
static int andArray[4] = {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000};
QByteArray Int2Byte(int int_data, int bits)
{
QByteArray byte_data;
bits = (bits > 4 || bits <= 0)? 4: bits;//1/2/3/4
for(int index = 0; index < bits; index++)
{
int offset = index * 8;
byte_data.append((char) ((andArray[index] & int_data) >> offset));
}
return byte_data;
}
int Byte2Int(QByteArray bytes)
{
int addr = bytes[0] & 0x000000FF;
addr |= ((bytes[1] << 8) & 0x0000FF00);
addr |= ((bytes[2] << 16) & 0x00FF0000);
addr |= ((bytes[3] << 24) & 0xFF000000);
return addr;
}
说明:
- data & 0x0000FF00 可以保留低二位的数据,清楚其他位数据;
- data >> 4 向右偏移 4 位,新增位置 0,可以将低二位变为低一位;
- a |= b 即 a = a|b,这里偏移之后,将新位置数据合并起来;
- byte 转 int 和 int 转 byte 操作相反,并使用 |= 进行数据位拼接;
注意:
在进行转换的时候需要考虑到低位和高位的问题,示例代码从 int 数据的低位开始取数,所以 QByteArray 中的数据的第一位是 int 的最低位,关于从低位到高位,还是高位到地位,需要和调用方商量好。
浮点型 <==> QByteArray
以x86平台的float型为例,float占4位,转换后QByteArray大小应该为4,QByteArray大小决定了存储的数据的范围
数据传输中,可以将浮点型乘以一定的倍数,转换成整型传输,也可以不乘,这里使用直接转换的方法
关于浮点数在内存中的存储方式,请参考相关文章,这里不作详细描述,总而言之,浮点数和整型数在内存中是相似的,所以只要将浮点数的内存中的内容直接转换即可
QByteArray Float2Byte(float data)
{
QByteArray byte_data;
char* data_char = (char*)&data;
for(int index = 3; index >= 0; index--)
{
byte_data.append(data_char[index]);
}
return byte_data;
}
float Byte2Float(QByteArray byte)
{
float result = 0;
int size = byte.size();
char* data_char = byte.data();
char* p = (char*)&result;
for(int index = 0; index < size; index++)
{
*(p + index) = *(data_char + size - 1 - index);
}
return result;
}
说明:
- 使用 char* 指针直接指向 float 数据的内存地址,并使用指针取出地址内容;
- 同样的,反向转换的时候,还是用指针将数据直接保存进内容中;
注意:
这里仍然要考虑高位和低位的问题,示例代码 float 转 QByteArray 中,从高位开始,所以转换后的QByteArray 的第一位是最高位,关于从低位到高位,还是高位到地位,需要和调用方商量好。
整型和浮点型与QByteArray的转换的更多相关文章
- Swift数据类型_整型和浮点型
//swift中的整型和浮点型 /** * //类型推断整数是Int 浮点数是Double ,日常使用需要注意不能越界,存储时间毫秒数 英雄经验数等等之类内容容易越界 整型 大多数情况下,你不需要在代 ...
- 《从零开始学Swift》学习笔记(Day 13)——数据类型之整型和浮点型
Swift 2.0学习笔记(Day 13)——数据类型之整型和浮点型 原创文章,欢迎转载.转载请注明:关东升的博客 Swift提供8.16.32.64位形式的有符号及无符号整数.这些整数类型遵循 ...
- python基本数据类型之整型和浮点型
python基本数据类型之数字与浮点型 在python3中,整数的数据类型为int,而浮点数的数据类型为float.python2中整数可以是int和long(长整型)两种类型,python3只保留了 ...
- go语言数据类型值--整型和浮点型
一.整型 1.整型的分类: 有符号整型: int8.int16.int32.int64 对应的无符号整型: uint8.uint16.uint32.uint64 uint就是我们熟知的byte类型,i ...
- Swift数据类型之整型和浮点型-备
Swift提供8.16.32.64位形式的有符号及无符号整数.这些整数类型遵循C语言的命名规约,我归纳了Swift中的整型: 整型示例: print("UInt8 range: \(UInt ...
- 以php中的比较运算符操作整型,浮点型,字符串型,布尔型和空类型
字符,数字,特殊符号的比较依赖ASC II表,本表原先有127个,后来又扩充了一些,里面包含了奇奇奇怪的符号. ASC II表 https://baike.baidu.com/item/ASCII/3 ...
- 老贾的幸福生活day6 整型和布尔值的转换 字符串讲解 for 循环简介
整型和布尔值的转换: 整型: python 2 整型 int long(长整型) /获取的是整型 python 3 整型 int 获取的是浮点数(小数) 十进制转二进制: print(bin(36)) ...
- Python基本数据类型之整型和布尔型
整型和布尔型 获取对象的数据类型 1.type() 2.dir() 3.help() 4.在pycharm里面的操作 数字类型 int 创建: int() 接收数字字符串 .bit_lenght() ...
- Java - 一道关于整型和字符类型相加的题目
题目 public class Test { public static void main(final String[] args) { final int a = 10; final int b ...
随机推荐
- ES5和ES6基本介绍与面向对象的基本思想
ES6和ES5基本介绍 let const 关键词定义变量 let 定义变量 特点: let 定义的变量,不会进行预解析 let 定义的变量,与 forEach() 中的变量类似 每次执行都会 ...
- 安装Mathmatica
MathMatica11.3版本 链接:https://pan.baidu.com/s/1YzQdgz4HxHd_xNwKoMX7lQ 提取码:mnr5 破解文件 链接:https://pan.bai ...
- stand up meeting 1/19/2016
part 组员 工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 准备最后的发布和整个开发的整理总结 6 继续releas ...
- stand up meeting 12-10
今天项目会议正好利用了大家上课前的十五分钟,大家对项目进度和项目中所遇到的问题进行了沟通. 由于天赋同学与重阳小组沟通及时有效,在mapping的过程中直接将单词本中的type与我们单词挑战中的que ...
- vue单页应用和和多页应用的区别
个人见解如下: 单页面应用(SinglePage Web Application )简称:SPA 多页面应用 (MultiPage Application) 简称:MPA 组成一个外壳和多个页面片段 ...
- 代理模式是什么?如何在 C# 中实现代理模式
代理模式 并不是日常开发工作中常常用到的一种设计模式,也是一种不易被理解的一种设计模式.但是它会广泛的应用在系统框架.业务框架中. 定义 它的 定义 就如其它同大部分 设计模式 的定义类似,即不通俗也 ...
- 【python】显示图片 并随意缩放图片大小 图片归一化
cv2.namedWindow("image_",0) cv2.imshow("image_",image)就可以随意缩放显示图片的窗口大小啦. ------ ...
- 浅析Java7中的ConcurrentHashMap
引入ConcurrentHashMap 模拟使用hashmap在多线程场景下发生线程不安全现象 import java.util.HashMap; import java.util.Map; impo ...
- 数据源管理 | PostgreSQL环境整合,JSON类型应用
本文源码:GitHub·点这里 || GitEE·点这里 一.PostgreSQL简介 1.和MySQL的比较 PostgreSQL是一个功能强大的且开源关系型数据库系统,在网上PostgreSQL和 ...
- gloo基本知识
Architechture(架构) Gloo通过Envoy XDS gRPC API来动态更新Envoy配置, 更方便的控制Envoy Proxy, 并保留扩展性..本质是一个Envoy xDS配置翻 ...