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

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

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总