量子保密通信网络——所得总结分享

2024-02-12 01:38

本文主要是介绍量子保密通信网络——所得总结分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

量子保密通信网络——所得总结分享

一、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()函数。

这篇关于量子保密通信网络——所得总结分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/701356

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers