本文主要是介绍量子保密通信网络——所得总结分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
量子保密通信网络——所得总结分享
一、qt程序打包
1.参考网址:
http://wenku.baidu.com/link?url=90jb4iPg49As8ioyH7jFBkI2kW99fuBZxm-RZFxP6PXMEMqnO5mOpOsaQDIIGHXw1LkiWJROeCaP7xc_t06qXR1enz_UVB1Pq27AwaHf6IC
http://www.cr173.com/html/15231_1.html
2.所用工具包(下载地址见第二个网址):
- hap-depends 查看软件的依赖库(*.dll)
- ASPack 动态链接库压缩软件
- filepack 软件的打包工具
3.过程描述(绝对路径 举例):
a.在D盘新建文件夹(比如project),用于放置.exe文件及其依赖文件,另新建文件夹(比如server),用于放置打包文件及程序所用文件(注意在程序中写清文件打开地址);b.找到所要打包程序的exe文件(比如rong.exe),拷贝到project中;c:打开开始菜单,点击运行,输入cmd进入命令界面,然后输入命令 cd/d D:\project,接着使用windeployqt工具命令(windeployqt rong.exe),这时就可以在project文件夹里看到windeployqt工具自动复制的插件文件夹和dll文件、qm文件;d:但可能还会少些dll文件,以致在其他电脑上无法成功运行该程序,这时需要用到hap-depends来打开project中的rong.exe文件,打开后,可以看到很多警告,那些警告(红色方块)对应的库就是需要的动态链接库,到Qt的安装目录(我的是 C:\Qt\Qt5.7.0\Tools\QtCreator\bin)将对用的库拷贝到project的所在目录即可。e:接下来用ASpack对rong.exe进行压缩;f:最后便是程序的打包了,首先点击下一步,接着选择project文件,然后选择rong.exe文件,在设置中选择“进程结束后删除解压文件”,压缩等级滑到最右边(最好),点击下一步,变量名称选择TempDir,“请选择要输出的EXE文件”选择server,可命名为“服务器端”,之后点击创建等待封装完成即可。
二、在textEdit中输出中文且不覆盖
1.举例:
QString show;
QString cc = QString::number(len);
show=QStringLiteral("手机标识为 ");
show+=QString::fromLatin1(mac);
show+=QStringLiteral(" 的用户 ");
show+=QString::fromLatin1(ID);
show+=QStringLiteral(" 已成功注入 ");
show+=cc;
show+=" bit ";
show+=QStringLiteral("密钥!");
ui->textEdit->append(show);
2.说明:
a.该例子中,len,mac,ID分别为 int,char,char 型变量;b.append为换行符,可不覆盖之前textEdit中的内容换行输出;c.如果要输出几句含变量的句子,仅用append是不够的,因为它会将这一句换行为几句,所以这个时候需要先定义一个QString型变量(比如shu,将变量类型也转化为QString型,这时可通过“+”将变量和其他文字变为一句,通过ui->textEdit->append(show);将其全部输出;d:如果要输出中文,可通过QStringLiteral实现,但仅凭一个QStringLiteral还是不够的,运行你会发现控制台显示“常量中有换行符”或者是输出的中文显示乱码;
解决办法是:用记事本方式打开该错误所在cpp文件,保存一下即可。但此法有一个后遗症,那就是以后你每改一次程序可能都要保存一下记事本文件,确实挺麻烦的,不过我还没找到其他办法,所以我建议中文这一步可在程序的最后一步进行,开始可先用英文代替。e:int,char型变量如何转化为QString型见例子。
3.单行添加颜色
ui->file->setTextColor(Qt::red);
ui->file->append(QStringLiteral("文件传输成功!"));
ui->file->setTextColor(Qt::black);如果只是加一句ui->file->setTextColor(Qt::red);,则之后每行都变为红色,不过在要变色的那一行之后紧接着加上ui->file->setTextColor(Qt::black);就可以看到只要需要的那一行变色了。
三、qt定义随机数
举例:
char* Widget::radomNumber()
{int i;char key[17] = { '\0' };char str[3]="01";QTime time;time= QTime::currentTime();qsrand(time.msec()+time.second()*1000);for (i = 0; i < 16; i++)//将key前五个赋予01随机数{key[i] = str[qrand()%2];}key[i]='\0';return key;
}
四、计时器
头文件:
#include <QDebug>#include <QTime>
计时开始位置写如下函数:
QTime time;time.start();
计时结束位置写如下函数:
qDebug()<<time.elapsed()/1000.0<<"s";(以秒为单位)或qDebug()<<time.elapsed()<<"ms";(以毫秒为单位)
结果:
程序运行,将在程序下方的控制台输出程序从开始到结束位置所用的时间。
五、获取系统当前日期时间
参考网址:
http://blog.sina.com.cn/s/blog_a6fb6cc90101djki.html
获取当前时间实现代码:
QTime current_time = QTime::currentTime();
int hour = current_time.hour(); (时)
int minute = current_time.minute(); (分)
int second = current_time.second(); (秒)
int msec = current_time.msec(); (毫秒)
获取系统当前日期时间并设置显示格式
QDataTime current_data_time = QDataTime::currentDataTime();
QString current_data = current_data_time.toString("yyyy-MM-dd hh:mm::ss ddd");
例:2016-08-22 18:10:17 周一
六、类型转换
1.将char型转化为QString型:macc->play
char macc[20];
QString play = QString::fromLatin1(macc);
2.将QString型转化为char *型:str1->a
char A[1024];
char *a = A; //对a初始空间
QString str1 ;
QByteArray ba = str1.toLatin1();//先将str1转化为QByteArray存储起来
a = ba.data();
3.将QString型转化为QByteArray型:
QString str;
QByteArray ba = str.toLatin1();
4.将int型转化为QString型:
int recvedLen;
QString cc = QString::number(recvedLen);
5.将字符串转化为数字:“1234”->1234
int Widget::ss(char *s)//将字符串转化为数字
{int i, sum = 0;for (i = 0; i < strlen(s); i++){sum = (s[i] - '0') + sum * 10;}return sum;
}
6.将1-9,a-f字符转化为对应的十六进制整数
char ConvertHexChar(char ch)
{if((ch>='0')&&(ch<='9'))return ch-0x30;//0到9: ASCII 值是 0x30...0x39,所以 ch - 0x30 就正好是正确的权else if((ch>='A')&&(ch<='F'))return ch-'A'+10;//A到F: 用 ch 的 ASCII 值减去 A 的 ASCII 值,就相当于 A到F 变成了 0到5,因为十六进制里 A=10...F=15,所以要加 10 才是正确的权else if((ch>='a')&&(ch<='f'))return ch-'a'+10;else return (-1);
}
7.将QString型转化为QByteArray 十六进制
QByteArray QString2Hex(QString str)
{QByteArray senddata;int hexdata,lowhexdata;int hexdatalen = 0;int len = str.length();senddata.resize(len/2); //设置长度char lstr,hstr;//个位和十位的数for(int i=0;i<len;){hstr = str[i].toLatain1();if(hstr == ' '){i++;continue;}i++;if(i>=len)break;lstr = str[i].toLatin1();hexdata = ConvertHexChar(hstr);lowhexdata = ConvertHexChar(lstr);if((hexdata == 16)||(lowhexdata == 16))break;elsehexdata = hexdata*16+lowhexdata;i++;senddata[hexdatalen] = (char)hexdata;hexdatalen++;}senddata.resize(hexdatalen);return senddata;
}
8.将接收的一串QByteArray类型的16进制,转化为对应的QString型16进制
QString ShowHex(QByteArray str)
{QDataStream out(&str,QIODevice::ReadWrite); //将str的数据 读到out数据流里面去QString buf;while(!out.atEnd()){qint8 outChar = 0;out >> outChar; //每次一个字节的填充到 outcharQString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0')).toUpper(); //2 字符宽度 //buf += ShowChar(str.toLatin1().data());}return buf;
}
9.将接收的一串QByteArray类型的16进制,每2个16进制转化为1个字的16进制的字符串
QString Convert4Hex(QByteArray str)
{QDataStream out(&str,QIODevice::ReadWrite); //将str的数据 读到out里面去QString buf;while(!out.atEnd()){qint16 outChar = 0;out>>outChar; //每次一个字节的填充到 outcharQString str = QString("%1").arg(outChar&0xFFFF,4,16,QLatin1Char('0')).toUpper() + QString(" "); //2 字符宽度buf += str;}return buf;
}
10.将十六进制转换成十进制的字符串
char ShowChar(char *a)
{int b,c;if(a[0]>=65&&a[0]<=70){b= a[0]-64;}else{b= a[0]-'0';}if(a[1]>=65&&a[1]<=70){c= a[1]-64+9;}else{c= a[1]-'0';}return (char) b*16+c;
}
七、数据库
1.涉及到的头文件
#include <QtSql/QSql>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlRecord>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
2.如果出现”qt_sql_default_connection”的错误,可通过以下代码解决问题:
QSqlDatabase db;if(QSqlDatabase::contains("qt_sql_default_connection"))db = QSqlDatabase::database("qt_sql_default_connection");
elsedb = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("D:/Server/database/User.db");//User为数据库的名字,注意要加上.db,否则可能会产生一个空白User文件,无法访问要用到的数据库。
3.从数据库中提取数据并在ui界面tableView中显示:
头文件:
#include <QSqlTableModel>
#include <QTableView
代码:
//首先要打开数据库,代码如上
db.open();
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("select * from User");model->setHeaderData(0,Qt::Horizontal,"ID");
model->setHeaderData(1,Qt::Horizontal,"start");
model->setHeaderData(2,Qt::Horizontal,"end");
model->setHeaderData(3,Qt::Horizontal,"mac");
model->setHeaderData(4,Qt::Horizontal,"lasttime");
model->setHeaderData(5,Qt::Horizontal,"consume");ui->show->setModel(model);//show为控件tableview名
db.close();
4.根据mac选择插入或更新数据库:
数据库中表格的表头有:ID start end mac lasttime consumeQSqlQuery my;
bool ff=true;//用来判断插入还是更新
int sta=ss(start);//start为char型
int en=ss(end);
my.exec("select * from User");
while(my.next())
{QString macc=my.value(3).toString();if(strcmp(macc.toLatin1().data(),mac)==0){my.prepare("update User set ID=:id,start=:start,end=:end,lasttime=:time,consume=:con where mac = :mac");my.bindValue(":mac",mac);my.bindValue(":id",ID);//更新数据my.bindValue(":start",sta);my.bindValue(":end",en);my.bindValue(":time",time);my.bindValue(":con",0);if(!my.exec()){qDebug()<<my.lastError();}else{qDebug()<<"updated!";//用到头文件#include<QDebug>QMessageBox::information(this,"Information","updated",QMessageBox::Ok);//用到头文件#include <QMessageBox>ff=false;}}
}
if(ff)//如果false为true,表明无重名,没有要更新数据,将插入数据
{my.prepare("insert into User values (?, ?, ?, ?, ?, ?)");//必须按顺序写my.addBindValue(ID);my.addBindValue(sta);my.addBindValue(en);my.addBindValue(mac);my.addBindValue(time);my.addBindValue(0);if(!my.exec()){qDebug()<<my.lastError();}else{qDebug()<<"insert succeed!";QMessageBox::information(this,"Information","insert succeed",QMessageBox::Ok);}
}
八、监听端口
用到头文件:
#include <QTcpServer>
实现代码:
QTcpServer *tcpServer;
tcpServer = new QTcpServer(this);
if(!tcpServer->listen(QHostAddress::AnyIPv4,9000))
{ //监听本地主机的9000端口,如果出错就输出错误信息,并关闭qDebug() << tcpServer->errorString();qDebug()<<" liseten error!";QMessageBox::warning(this,"Information","listen error!",QMessageBox::Yes);close();
}
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(recvMessage()));//接收到连接信号便跳转到recvMessaage函数
九、阻塞
头文件:
#include <qtcpsocket.h>
代码:
QTcpSocket *clientConnection =tcpServer->nextPendingConnection() ;
if( clientConnection->waitForReadyRead() == true) //注意::读取要设成阻塞状态 因为客户端的也是阻塞写clientConnection->read(recvbuf,100);阻塞写:clientsocket->write(recvbuf,100);
十、文件操作
1.读取文件内容
char key[33] = {'\0'};
FILE *fp;
fp = fopen(fileName1,"r");
if(fp!=NULL)
{fgets(key,33,fp);//从文件中读取33个密钥
}
fclose(fp);
2.从一个文件中指定位置读取写入文件
#include <QFile>
#include <QMessageBox>
QFile file("user.txt");
file.open(QFile::WriteOnly|QFile::Text);FILE *QFile = fopen("Qkey.txt","r");
if(QFile == NULL)
{QMessageBox::warning(NULL,"Warring","open File fail",QMessageBox::Yes);
}
if(fseek(QFile,begin,0)==0)//第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置)
{fread(key,1,len,QFile);
}
fclose (QFile);file.write(key,strlen(key));
file.close();
十一、定时器
QTimer *timer;
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(autodata()));
timer->start(500);
//在这500ms内,程序仍会往下进行,到达500ms后自动进入autodata()函数。
这篇关于量子保密通信网络——所得总结分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!