整型和浮点型与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 ...
随机推荐
- PAS
一.概念 二.安装 打开Delphi,在主菜单上选择Component,单击Install Component,出现图所示的对话框.有两个选择,装到已经存在的包里面和装到新的包里面.我们选择后者,单击 ...
- Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。
实际使用中,经常需要使用不同精确度的Date,比如保留到天 2020-04-23 00:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyy-MM-dd) ...
- python-用户输入和while循环
函数input() 比较大小要同类型: age=iput() 21 age=int(age) age>=10 true prompt = "If you tell us who you ...
- mybatis源码学习:一级缓存和二级缓存分析
目录 零.一级缓存和二级缓存的流程 一级缓存总结 二级缓存总结 一.缓存接口Cache及其实现类 二.cache标签解析源码 三.CacheKey缓存项的key 四.二级缓存TransactionCa ...
- LDA概率主题模型
目录 LDA 主题模型 几个重要分布 模型 Unigram model Mixture of unigrams model PLSA模型 LDA 怎么确定LDA的topic个数? 如何用主题模型解决推 ...
- vector做形参时的三种传参方式
vector在做形参的时候传参的方式和普通的变量是一样的,要么传值.要么传引用.要么传指针. 现在分别定义三个以vector为形参的函数: (1) fun1(vector <int> v) ...
- ajax 报0错误
本以为在本地测试不会跨越,结果检查下来就是跨域的问题!!!! 来源:https://www.cnblogs.com/xiezn/p/5651093.html PHP Ajax 跨域问题最佳解决方案 ...
- ansible的清单管理与模块应用(三)
- QtConcurrent::run() 只能运行参数个数不超过5的函数
有时不得不看源码 qtconcurrentrun.h template <typename T, typename Param1, typename Arg1, typename Param2, ...
- qt tableview 选择模式
QAbstractItemView::SingleSelection QAbstractItemView::ContiguousSelection QAbstractItemView::Extende ...