B类地址,斜线记法,192.168.60.1/24其中192.168.10.1是IP字符串strIP,24是子网掩码1的个数nSubnetMas,其中要求18<=nSubnetMas<=30
#include "qdlgiptool.h"
#include "ui_qdlgiptool.h"
#include <QDebug>//
#include <QtMath>//数学函数
#include <QMessageBox>////单击“计算”按钮消息处理函数
void QDlgIPTool::on_btIPToolCal_clicked()
{QString strIP;//IP字符串int nSubnetMask;//子网掩码整数(nSubnet个1)quint64 subnetMaskTotal=0;//子网掩码位nSubnetMask个1用10进制表示quint64 hostTotal=0;//主机位(32-nSubnetMask)个1用10进制表示quint64 temp=0;//临时变量//计算IP===========================================================ui->widgetIP->setFocus();//设置焦点strIP=ui->widgetIP->getIP();//获取IP字符串if(strIP.isEmpty())//判断IP是否为空{QMessageBox::information(this,"消息","请输入IP地址!",QMessageBox::Ok,QMessageBox::NoButton);}else{QStringList strListIP=strIP.split(".");//按照指定的字符分割IP字符串QString strIP1=strListIP[0];QString strIP2=strListIP[1];QString strIP3=strListIP[2];QString strIP4=strListIP[3];//输出分割后的IP字符串//qDebug()<<strIP1;//qDebug()<<strIP2;//qDebug()<<strIP3;//qDebug()<<strIP4;//判断IP地址是否全部输入if(strIP1.isEmpty()||strIP2.isEmpty()||strIP3.isEmpty()||strIP4.isEmpty()){QMessageBox::information(this,"消息","请补全IP地址!",QMessageBox::Ok,QMessageBox::NoButton);}else{uint nIP1=strIP1.toUInt();uint nIP2=strIP2.toUInt();uint nIP3=strIP3.toUInt();uint nIP4=strIP4.toUInt();//qDebug()<<nIP1;//qDebug()<<nIP2;//qDebug()<<nIP3;//qDebug()<<nIP4;//计算子网掩码=================================================nSubnetMask=ui->spinBoxnumSubnetMask->value();//获取子网掩码1的个数//计算出子网掩码位nSubnetMask个1用10进制表示的整数for(int i=0;i<nSubnetMask;i++){temp=1;temp<<=(31-i);subnetMaskTotal|=temp;}//qDebug()<<subnetTotal;//输出子网掩码的10进制数//计算出子网掩码各个段10进制整数uint nSubnetMask1=(subnetMaskTotal&4278190080)>>24;uint nSubnetMask2=(subnetMaskTotal&16711680)>>16;uint nSubnetMask3=(subnetMaskTotal&65280)>>8;uint nSubnetMask4=(subnetMaskTotal&255);//转换出子网掩码各个段10进制整数的字符串形式QString strSubnetMask1=QString::number(nSubnetMask1,10);QString strSubnetMask2=QString::number(nSubnetMask2,10);QString strSubnetMask3=QString::number(nSubnetMask3,10);QString strSubnetMask4=QString::number(nSubnetMask4,10);//整合子网掩码各个段10进制整数的字符串形式QString strSubnetMask=strSubnetMask1+"."+strSubnetMask2+"."+strSubnetMask3+"."+strSubnetMask4;//qDebug()<<strSubnetMask;//输出整合后的子网掩码字符串ui->widgetSubNetMask->setIP(strSubnetMask);//设置子网掩码显示//计算网络号===============================================//计算出网络号各个段10进制整数的字符串形式QString strNet1=QString::number(nIP1&nSubnetMask1,10);QString strNet2=QString::number(nIP2&nSubnetMask2,10);QString strNet3=QString::number(nIP3&nSubnetMask3,10);QString strNet4=QString::number(nIP4&nSubnetMask4,10);//整合网络号各个段10进制整数的字符串形式QString strNet=strNet1+"."+strNet2+"."+strNet3+"."+strNet4;//qDebug()<<strNet;//输出整合后的网络号字符串ui->widgetNetNumber->setIP(strNet);//设置网络号显示//计算第一个可用IP===========================================//计算出第一个可用IP各个段10进制整数的字符串形式QString strFirstValidIP1=QString::number(nIP1&nSubnetMask1,10);QString strFirstValidIP2=QString::number(nIP2&nSubnetMask2,10);QString strFirstValidIP3=QString::number(nIP3&nSubnetMask3,10);QString strFirstValidIP4=QString::number((nIP4&nSubnetMask4)+1,10);//整合第一个可用IP各个段10进制整数的字符串形式QString strFirstValidIP=strFirstValidIP1+"."+strFirstValidIP2+"."+strFirstValidIP3+"."+strFirstValidIP4;//qDebug()<<strFirstValidIP;//输出整合后的第一个可用IP字符串ui->widgetFirstValidIP->setIP(strFirstValidIP);//设置第一个可用IP显示//计算最后一个可用IP===========================================//计算出主机位(32-nSubnet)个1用10进制表示的整数for(int16_t i=0;i<32-nSubnetMask;i++){temp=1;temp<<=i;hostTotal|=temp;}//qDebug()<<hostTotal;//输出主机的10进制数//计算出最后一个可用IP各个段10进制整数的字符串形式temphost1=quint8(hostTotal>>24);QString strGuangBoIP1=QString::number((nIP1&nSubnetMask1)|temphost1,10);temphost2=quint8(hostTotal>>16);QString strGuangBoIP2=QString::number((nIP2&nSubnetMask2)|temphost2,10);quint8 temphost3=quint8(hostTotal>>8);QString strLastValidIP3=QString::number((nIP3&nSubnetMask3)|temphost3,10);quint8 temphost4=quint8(hostTotal&255);QString strLastValidIP4=QString::number(((nIP4&nSubnetMask4)|temphost4)-1,10);//整合最后一个可用IP各个段10进制整数的字符串形式QString strLastValidIP=strLastValidIP1+"."+strLastValidIP2+"."+strLastValidIP3+"."+strLastValidIP4;//qDebug()<<strLastValidIP;//输出整合后的最后一个可用IP字符串ui->widgetLastValidIP->setIP(strLastValidIP);//设置最后一个可用IP显示//计算广播IP===========================================//计算出广播IP各个段10进制整数的字符串形式temphost1=quint8(hostTotal>>24);QString strGuangBoIP1=QString::number((nIP1&nSubnetMask1)|temphost1,10);temphost2=quint8(hostTotal>>16);QString strGuangBoIP2=QString::number((nIP2&nSubnetMask2)|temphost2,10);temphost3=quint8(hostTotal>>8);QString strGuangBoIP3=QString::number((nIP3&nSubnetMask3)|temphost3,10);temphost4=quint8(hostTotal&255);QString strGuangBoIP4=QString::number((nIP4&nSubnetMask4)|temphost4,10);//整合广播IP各个段10进制整数的字符串形式QString strGuangBoIP=strGuangBoIP1+"."+strGuangBoIP2+"."+strGuangBoIP3+"."+strGuangBoIP4;//qDebug()<<strGuangBoIP;//输出整合后的广播IP字符串ui->widgetGuangBoIP->setIP(strGuangBoIP);//设置广播IP显示//计算子网数(适用于B类地址)===========================================double nSubnetNumber=qPow(2,nSubnetMask-16)-2;//计算子网数QString strSubnetNumber=QString::number(nSubnetNumber);ui->lineEditSubnetNumber->setText(strSubnetNumber);//设置子网数显示//计算每个子网主机数===========================================double nHostNumber=qPow(2,32-nSubnetMask)-2;//计算主机数QString strHostNumber=QString::number(nHostNumber);ui->lineEditHostNumber->setText(strHostNumber);//设置主机数显示ui->btIPToolCal->setFocus();//设置焦点}}
}