Qt 如何将一个输出结果是0x84c7ff9c10的unsigned char[]数组转化成QByteArray?

二、IEC101/104规约遥测量类型转换

STD 754,本文介绍利用union数据类型完成字节数组向这三种类型转换的方法。

在IEC、103、104中,指出遥测值上送支持三种标准:归一化、标度化、短浮点数。其中归一化的处理比较繁琐,尤其是将真实值与归一化值做相互转换的时候,假如按照规约的处理方式会变得十分麻烦,这儿给出一个极其简单的转换公式,以供大家参考:

注:在对负数做归一化处理时,有将32767变为32768来处理的情况。

其中,满码值是通信双方约定的一个值,这个值一般是真实值的上限,也就是说真实的值应该小于该值。假如真实值大于满码值,将会发生溢出的情况。但满码值不宜取的过大。因为在归一化转换和还原的时候,必然会出现数值的误差情况,具体误差跟满码值有直接的关系,可以自行验证。

定义union数据类型,该union类型定义了多种不同数据类型的内部变量,但各个内部变量共享一段内存,在不同时间里保存不同的数据类型和长度的变量,此处共只占用4个字节。

归一化值由两个字节组成。1位符号位,0表示正数,1表示负数。15位数据位,正数是原码,负数是补码。

标度化值也由两个字节组成。1位符号位,0表示正数,1表示负数。15位数据位,正数是原码,负数是补码。

短浮点数由四个字节组成。1位符号位,0表示正数,1表示负数。
由于C语言中浮点数本身就是采用IEEE格式来存储的,可巧妙利用union数据类型实现两者之间的转换,如下:

关于短浮点数更为详细的描述参看:“”。

其中,把上面的二进制数划分如下:

符号位 | 指数位(阶码表示,8位) | 有效位(尾码)

应用数据封装,发送到物理层或相反

FCB、DFC位的处理(见下)

摘自“DLT 634. 远动设备及系统 第5-101部分 传输规约基本远动任务配套标准”。

请求访问位,ACD=1:表示终端有1级用户数据,希望向主站传输
状态量变化(事件变位记录)
带品质描述词的双点信息
带品质描述词的单点信息

启动报文位PRM  PRM=1,表示主站向子站传输,主站为启动站。

位取相反值,主站为每一个子站保留一个帧计数位的拷贝,若超时没有从子站收到所期望的报文,或接收出现差错,则主站不改变帧计数位(FCB)的状态,重复传送原报文,重复次数为3 次。子站应在接收报文后分析判断FCB位,如子站接收报文的FCB位未改变,则子站重发原来的帧,否则通信不正确。若主站正确收到子站报文,则该一轮的发送/确认(SEND/CONFIRM)或请求/响应(REQUEST/RESPOND)传输服务结束。复位命令的帧计数位常为0,帧计数有效位FCV=0。

发送/无回答服务、重传次数为0的报文、广播报文时不需考虑报文丢失和重复传输,无需改变帧计数位(FCB)的状态,因此这些帧的计数有效位常为0。

数据流控制(DFC)  DFC=0 表示子站可以继续接收数据。DFC=1 表示子站数据区已满,无法接收新数据。

包含链路复位、链路测试发送/确认、用户数据发送/确认、请求链路状态。

2)TI类型标识的释义

3)COT传送原因的释义

信息体地址点号=信息体地址-起始地址

以总召帧为例,报文解析详见“之二、配置说明”

{ …………………………………………………………………

  FCB的处理(略),作用见本文“4、IEC101/104规约一般说明”。

另见本节1)TI类型标识的释义图片

//关于SQ见“之1.3 应用服务数据单元ASDU

Bit7=SQ=1连续单点信息,0x84表示连续4个单点信息(信息体数目为4)


另见本节2)COT传送原因的释义图片

…………………………………………………………………

CP56time2a是101/104规约中定义的时间格式,101和104是电力通信规约的一种,2000年左右进行了修订,现在使用的104规约应该就是2000年的版本。
根据以前下载的一个文档的说明,104规约应该是默认的20xx年了,所以xx是从00-99年,所以7bit能表示00-99就可以了。毕竟一种规约能用一百年,已经了不起了。

3、一级数据、二级数据

一级数据主要包括SOE、动作事件等;二级数据主要是遥测。

四、IEC101遥信、遥测与遥控及加密

遥测和遥信是配电终端向调度中心传送信息,遥控是调度中心向配电终端下达的操作命令,直接干预电网的运行。

单点遥信和双点遥信在地址上不区分,都是遥信量。无论单点还是双点,存储单位都是字节或字。单点双点跟存储单元无关,跟地址无关。

单点遥信是用一位表示一个遥信量,比如开关位置,只采集一个常开的辅助接点,值为1表示合位,0表示分位;

双点遥信需要采集常开和常闭两个辅助接点位置:当常开点值=1并且常闭点值=0,则认为开关在合位(0x10);当常开点值=0并且常闭点值=1,认为开关在分位(0x01);当两个位置值都为1,或者两个值都为0,则认为开关位置不能确定。

要求有很高的可靠性。在遥控过程中,采用“返送校核”的方法,实现遥控命令的传送。所谓“返送校核”是指配电终端接收到调度中心的命令后,为了保证接收到的命令能正确地执行,对命令进行校核,并返送给调度中心的过程。

配电终端向调度中心运送的校核信息,用以指明配电终端所收到命令与主站原发的命令是否相符以及配电终端能否执行遥控选择命令的操作。为此,配电终端校核包括三个方面:

校核遥控选择命令的正确性,即检查性质码是否正确,检查遥控对象号是否属于本配电终端;

检查配电终端遥控输出对象继电器和性质继电器是否能正确动作。下图给出了遥控过程中调度中心和配电终端的命令和信息的传送顺序;

遥控命令,包括返校信息均连送三遍。

遥控选择 → 返校 → 执行

校核内容可能包含有位处、远方/就地状态、配电终端地址等。比如处于合位发出合闸指令无效处于就地发出合闸/分闸指令无效地址错误等。

(2)单点遥控与双点遥控

}

在Qt下写串口字符串读写方面的程序,里面需要处理一些QString和字符数组等方面的字符处理。

在幕后,QString使用隐式共享(写时复制)来减少内存使用并避免不必要的数据复制。这也有助于减少存储16位字符而不是8位字符的固有开销。

除了QString,Qt还提供QByteArray类来存储原始字节和传统的以8位“\0”结尾的字符串。在大多数情况下,QString是您要使用的类。它在整个Qt API中使用,Unicode支持确保了如果您希望在某个时候扩展应用程序的市场,应用程序将易于翻译。QByteArray适用的两种主要情况是需要存储原始二进制数据时,以及内存保护非常重要时(如在嵌入式系统中)。

QByteArray可用于存储原始字节(包括“\0”)和传统的以8位“\0”结尾的字符串。使用QByteArray比使用const char*方便得多。在后台,它总是确保数据后面跟着一个“\0”终止符,并使用隐式共享(写时复制)来减少内存使用并避免不必要的数据复制。

除了QByteArray,Qt还提供QString类来存储字符串数据。在大多数情况下,QString是您要使用的类。它存储16位Unicode字符,使您可以轻松地在应用程序中存储非ASCII/非拉丁-1字符。此外,QString在Qt API中贯穿始终。QByteArray适用的两种主要情况是需要存储原始二进制数据时,以及内存保护非常重要时(例如,对于嵌入式Linux,使用Qt)。

那么两者之间的转换呢?

以下的方法都是从网上搜索和帮助文档中获得;

}

字节数组类QByteArray提供一个字节数组用于存储原始字节,号称 Best array!它比使用char *更方便,该类在串口通信中经常被使用,因为串口通信数据都是一个一个的8位字节流。

虽然size()为5,但是字节数组在最后还会保留一个额外的’\ 0’字符, 以便如果使用一个函数来请求指向底层数据的指针(例如调用data()),那么指出的数据保证被’\ 0’终止。

以下代码,是无法编译通过的,因为索引是小于size的。加\0,不是说size就变6了。

//无法编译通过,报错,索引不允许等于size!

这在调试特别有用,因为大多Hex码没有字符显示

其中,参数n是要转变的整数;base是要进行转换的进制,进制取值范围为2到36,
即从二进制到三十六进制。该函数返回整数n对应的base进制的字符数组。下列代码演示

7、字符串数值转为各类数值

11、QByteArray与自定义结构体之间的转化

13、向前搜索和向后搜索

函数insert()可以在某个索引位置上插入:

}

我要回帖

更多关于 qstring转qbytearray 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信