4.辅助类使用

1.QByteArray
思考:char buf[6] = "hello";
如果要把buf改成"hello world",该怎样做。

Qt通过QByteArray为我们提供了一个字节数组容器(它是可变长的)。主要用来存储原始的字节数据。
QByteArray仍可以表示字符串,类似与char buf[],但是QT中多用QString来表示字符串。
一般结合其它类使用,比如QIODevice类的QByteArray QIODevice::readAll()

常用接口:
QByteArray(const char *data, int size = -1)  //构造
char	at(int i) const //返回第i个元素
void	clear()  //清空
bool	contains(const char * str) const  //是否包含字符串
bool	contains(char ch) const //是否包含字符
char 	*data()  //转换
//查找从from开始第一次匹配str的位置
int	indexOf(const char *str, int from = 0)
QByteArray & append(char ch)  //尾部增加
QByteArray & prepend(char ch) //头部增加
int	length() const //返回长度
QByteArray &remove(int pos, int len)  //删除

实例:QByteArray定义一个字符串"hello",以16进制输出每个字符。
在其前增加‘my’,其后增加'world',验证新字符串中是否包含"hello"字符串。
删除从"world"字符串开始的后续所有字符并验证。

2.QString
QString类提供了一个Unicode文本和经典的C以零结尾的字符数组的抽象。

//从数字转为字符串
QString & QString::setNum(int n, int base = 10)
QString & QString::setNum(double n, char format = 'g', int precision = 6)

QString	number(long n, int base = 10)
QString	number(double n, char format = 'g', int precision = 6):
long a = 63;
QString s = QString::number(a, 10);             //s = "63"
QString t = QString::number(a, 16).toUpper();     // t == "3F"

//从字符串转为数字
short	toShort(bool * ok = 0, int base = 10) const
float	toFloat(bool * ok = 0) const
long	toLong(bool * ok = 0, int base = 10) const

QString str1 = "1234.56";
str1.toFloat();             // returns 1234.56

//从 QString 转化到 QByteArray
QByteArray toLocal8Bit() const

例:把一个QString转为char *(QString没有直接转换为char *的方法,
需要中间经过一层QByteArray的过渡)

	QString str1 = "hello";
	char *s = str1.toLocal8Bit().data();
	
3.QList--模板类
QList(const QList<T> & other)
QList<T> &	operator<<(const QList<T> & other)

实例:定义一个int类型List,初始化为1 5 9,再增加4
实例:定义一个QString类型List,操作测试

HDLC实例:
串行通信HDLC协议数据格式如下:

数据包起始	有效数据	校验		数据包结束
0x7E		N个数据		有效数据求和	0x7D

如果有效数据或校验中任一A等于0x00,0x7e,0x7c,0x7d中任一数据,则先发送0x7c再发送A^0X20.
实例:需要发送的数组:Buf[5] = {0x00,0x01,0x7c,0x10,0x7d};
则数据发送应为:0x7e,0x7c,0x20,0x01,0x7c,0x5c,0x10,0x7c,0x5d,0x0a,0x7d

使用QByteArray来完成HDLC协议的编码,尝试把编码过程封装成函数。
#include <QCoreApplication>
#include <QByteArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
#if 0
    QByteArray ba("hello");
    for(int i=0; i<ba.length(); i++){
        qDebug() << ba.at(i);
    }

    ba.prepend("my ");
    ba.append(" world");

    qDebug()<<ba;

    if(ba.contains("hello")){
        qDebug()<<"contains";
    }else{
        qDebug()<<"no contains";
    }

    ba.remove(ba.indexOf("world"), 5);
    qDebug()<<"after remove = "<<ba;
#endif
    QList<int> list;
    list << 1 << 5 << 9;
    list.append(4);
    qDebug()<<list;

    QList<QString> liststr;
    liststr<<"abc"<<"def";
    qDebug()<<liststr;

    return a.exec();
}

#include <QCoreApplication>
#include <QByteArray>
#include <QDebug>

/**
 * @brief 如果是特殊字节,那么返回处理后结果,否则返回-1
 * @param ch
 * @return
 */
char isSpecial(char ch)
{
    switch (ch) {
    case 0x00:
    case 0x7c:
    case 0x7e:
    case 0x7d:
        return ch ^ 0x20;
        break;
    default:
        return -1;
        break;
    }
}

QByteArray hdlcCode(QByteArray ba)
{
    char sum = 0;
    char ret;
    QByteArray tmp;

    for(int i=0; i<ba.length(); i++){
        sum += ba.at(i);  //0x10a-->0x0a
    }
    ba.append(sum); //编码数据首先增加校验字节

    tmp.append(0x7e);  //增加头
    for(int i=0; i<ba.length(); i++){
        ret = isSpecial(ba.at(i));
        if(ret != -1){
            tmp.append(0x7c);
            tmp.append(ret);
        }else{
            tmp.append(ba.at(i));
        }
    }
    tmp.append(0x7d); //增加尾

    return tmp;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //下面实现HDLC编码
    QByteArray tmp;

    char buf[] = {0x00,0x01,0x7c,0x10,0x7d};
    QByteArray ba(buf, sizeof(buf));

    tmp = hdlcCode(ba);
    for(int i=0; i<tmp.length(); i++){
        qDebug("0x%x", tmp.at(i));
    }


    return a.exec();
}

发布了10 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40083589/article/details/94025531