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
void clear()
bool contains(const char * str) const
bool contains(char ch) const
char *data()
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);
QString t = QString::number(a, 16).toUpper();
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();
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>
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);
}
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);
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();
}