QString ->char

ui.lineEdit->text().toLatin1().data()
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), receiver(new MulticastReceiver(this)), frameParser(new UdpFrameParser(this)), radarParser(new RadarDataParser(this)), isListening(false), totalPackets(0), totalBytes(0), validFrames(0), validRadarData(0) { ui->setupUi(this); // 填充网络接口列表 populateNetworkInterfaces(); // 连接信号和槽 connect(receiver, &MulticastReceiver::dataReceived, this, &MainWindow::onDataReceived); } MainWindow::~MainWindow() { if (isListening) { receiver->leaveMulticastGroup(); } delete ui; } void MainWindow::populateNetworkInterfaces() { ui->interfaceComboBox->clear(); // 添加"任意接口"选项 ui->interfaceComboBox->addItem(tr("任意接口"), QVariant()); // 获取所有网络接口 QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces(); for (const QNetworkInterface &interface : interfaces) { // 只添加活动的接口 if (interface.flags().testFlag(QNetworkInterface::IsUp) && interface.flags().testFlag(QNetworkInterface::IsRunning) && !interface.flags().testFlag(QNetworkInterface::IsLoopBack)) { QString name = interface.humanReadableName(); QList<QNetworkAddressEntry> entries = interface.addressEntries(); // 获取当前网络接口的所有地址条目 // 查找IPv4地址 for (const QNetworkAddressEntry &entry : entries) { if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol) //检查地址是否为IPv4协议 { name += " (" + entry.ip().toString() + ")"; break; } } ui->interfaceComboBox->addItem(name, interface.name()); } } } void MainWindow::on_startStopButton_clicked() { if (!isListening) { // 开始监听 QString multicastIp = ui->multicastIpEdit->text(); quint16 port = ui->portSpinBox->value(); // 验证IP地址 QHostAddress groupAddress(multicastIp); if (groupAddress.isNull() || !groupAddress.isMulticast()) { QMessageBox::warning(this, tr("错误"), tr("无效的组播IP地址。组播地址范围为224.0.0.0至239.255.255.255。")); return; } // 获取选择的网络接口 QNetworkInterface interface; if (ui->interfaceComboBox->currentIndex() >= 0) { QString interfaceName = ui->interfaceComboBox->currentData().toString(); interface = QNetworkInterface::interfaceFromName(interfaceName); } // 加入组播组 if (receiver->joinMulticastGroup(groupAddress, port, interface)) { isListening = true; ui->startStopButton->setText(tr("停止监听")); ui->multicastIpEdit->setEnabled(false); ui->portSpinBox->setEnabled(false); ui->interfaceComboBox->setEnabled(false); ui->statusBar->showMessage(tr("正在监听 %1:%2").arg(multicastIp).arg(port)); } else { QMessageBox::critical(this, tr("错误"), tr("无法加入组播组。请检查IP地址、端口和网络接口设置。")); } } else { // 停止监听 receiver->leaveMulticastGroup(); isListening = false; ui->startStopButton->setText(tr("开始监听")); ui->multicastIpEdit->setEnabled(true); ui->portSpinBox->setEnabled(true); ui->interfaceComboBox->setEnabled(true); ui->statusBar->showMessage(tr("监听已停止")); } } void MainWindow::on_clearButton_clicked() { // 清除显示和统计信息 ui->textDisplay->clear(); ui->hexDisplay->clear(); ui->frameDisplay->clear(); ui->radarDisplay->clear(); totalPackets = 0; totalBytes = 0; validFrames = 0; validRadarData = 0; ui->packetsLabel->setText("0"); ui->bytesLabel->setText("0"); ui->framesLabel->setText("0"); ui->radarDataLabel->setText("0"); } void MainWindow::onDataReceived(const QByteArray &data, const QHostAddress &sender, const QDateTime &time) { // 更新统计信息 updateStats(data.size()); // 格式化时间 QString timeStr = time.toString("yyyy-MM-dd hh:mm:ss.zzz"); // 显示文本形式 QString textInfo = QString("[%1] 来自 %2: ").arg(timeStr).arg(sender.toString()); QString textData = QString::fromUtf8(data) + "\n"; ui->textDisplay->append(textInfo + textData); // 显示十六进制形式 QString hexInfo = QString("[%1] 来自 %2: \n").arg(timeStr).arg(sender.toString()); QString hexData; // 格式化十六进制数据 const int bytesPerLine = 16; for (int i = 0; i < data.size(); ++i) { // 添加十六进制值 hexData += QString("%1 ").arg(static_cast<quint8>(data[i]), 2, 16, QChar('0')).toUpper(); // 每行16个字节,添加ASCII表示 if ((i + 1) % bytesPerLine == 0 || i == data.size() - 1) { // 补齐空格以对齐ASCII部分 int spacesToAdd = bytesPerLine - (i % bytesPerLine) - 1; if (i == data.size() - 1 && (i % bytesPerLine) != bytesPerLine - 1) { for (int j = 0; j < spacesToAdd; ++j) { hexData += " "; } } // 添加分隔符 hexData += " | "; // 添加ASCII表示 int startPos = i - (i % bytesPerLine); int endPos = qMin(i + 1, data.size()); for (int j = startPos; j < endPos; ++j) { char c = data[j]; hexData += (c >= 32 && c <= 126) ? c : '.'; } hexData += "\n"; } } ui->hexDisplay->append(QString("[%1] 来自 %2: \n").arg(timeStr).arg(sender.toString()) + hexData); // 解析UDP帧结构 UdpFrame frame; bool parseResult = frameParser->parseFrame(data, frame); // 添加调试信息 QString debugInfo = QString("[%1] 数据包长度: %2 字节, 解析结果: %3\n") .arg(timeStr) .arg(data.size()) .arg(parseResult ? "成功" : "失败"); // 始终尝试解析数据,即使数据包很小 if (data.size() >= 32) { // 至少包含帧头 if (parseResult) { // 更新有效帧计数 validFrames++; ui->framesLabel->setText(QString::number(validFrames)); // 显示帧信息 QString frameInfo = QString("[%1] 来自 %2: \n").arg(timeStr).arg(sender.toString()); QString frameData = frame.toDetailedString(); ui->frameDisplay->append(debugInfo + frameInfo + frameData + "\n\n"); // 如果帧解析成功且有数据域,尝试解析雷达数据 if (frame.dataLength > 0) { // 尝试解析雷达数据 RadarDataParser::DataType dataType = radarParser->identifyDataType(frame.data); QString radarInfo; bool radarParseSuccess = false; if (dataType == RadarDataParser::SingleTarget) { SingleTargetData targetData; radarParseSuccess = radarParser->parseSingleTargetData(frame.data, targetData); if (radarParseSuccess) { radarInfo = "单目标雷达数据:\n" + targetData.toString(); } } else if (dataType == RadarDataParser::MultiTarget) { MultiTargetData targetsData; radarParseSuccess = radarParser->parseMultiTargetData(frame.data, targetsData); if (radarParseSuccess) { radarInfo = "多目标雷达数据:\n" + targetsData.toString(); } } QString radarDebugInfo = QString("[%1] 雷达数据长度: %2 字节, 类型: %3, 解析结果: %4\n") .arg(timeStr) .arg(frame.data.size()) .arg(dataType == RadarDataParser::SingleTarget ? "单目标" : dataType == RadarDataParser::MultiTarget ? "多目标" : "未知") .arg(radarParseSuccess ? "成功" : "失败"); if (radarParseSuccess) { // 更新有效雷达数据计数 validRadarData++; ui->radarDataLabel->setText(QString::number(validRadarData)); // 显示雷达数据信息 QString radarDisplayInfo = QString("[%1] 来自 %2: \n").arg(timeStr).arg(sender.toString()); ui->radarDisplay->append(radarDebugInfo + radarDisplayInfo + radarInfo + "\n\n"); } else { // 解析失败,显示调试信息 ui->radarDisplay->append(radarDebugInfo + "无法解析为有效雷达数据\n"); // 显示原始数据的十六进制表示,以便调试 QString hexDump; for (int i = 0; i < frame.data.size(); ++i) { hexDump += QString("%1 ").arg(static_cast<quint8>(frame.data[i]), 2, 16, QChar('0')).toUpper(); if ((i + 1) % 16 == 0) hexDump += "\n"; else if ((i + 1) % 8 == 0) hexDump += " "; } // 添加ASCII显示 hexDump += "\n\nASCII:\n"; for (int i = 0; i < frame.data.size(); ++i) { char c = frame.data[i]; // 只显示可打印字符 if (c >= 32 && c <= 126) { hexDump += c; } else { hexDump += "."; } if ((i + 1) % 16 == 0) hexDump += "\n"; } ui->radarDisplay->append("原始数据:\n" + hexDump + "\n\n"); } } } else { // 解析失败,显示调试信息 ui->frameDisplay->append(debugInfo + "无法解析为有效帧\n"); // 显示原始数据的十六进制表示,以便调试 QString hexDump; for (int i = 0; i < qMin(data.size(), 64); ++i) { // 只显示前64字节 hexDump += QString("%1 ").arg(static_cast<quint8>(data[i]), 2, 16, QChar('0')).toUpper(); if ((i + 1) % 16 == 0) hexDump += "\n"; } ui->frameDisplay->append("原始数据前64字节:\n" + hexDump + "\n\n"); } } else { // 数据包太小,不可能是有效帧 ui->frameDisplay->append(debugInfo + "数据包太小,不是有效帧\n\n"); } } void MainWindow::updateStats(int bytes) { totalPackets++; totalBytes += bytes; ui->packetsLabel->setText(QString::number(totalPackets)); ui->bytesLabel->setText(QString::number(totalBytes)); } 大概介绍每个函数的功能并重写函数,要求功能千万不能变,只是小改动看起来不像抄袭,可以将注释改为中文
08-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值