ASC格式惯导数据文件转IMR格式文件

article/2025/7/3 12:24:39

   我们使用惯导采集数据之后,如果需要用现有软件进行解算,比如POSMind等等,就会涉及到IMR格式的惯导数据文件。而NovAtel Convert转换软件只能将原始DAT格式的文件转成ASCLL文件,因此我自编程实现了ASC格式文件到IMR格式文件的转换。

ASC格式文件

ASCII数据格式如下:

表 1 ASC文件数据含义

数据内容

含义

%RAWIMUSA

IMU原始文件头,需要提取有该符号标识的这一行数据

42919.530

GPS周内秒

42919.529998647

IMU 时间

-494

加速度计Z轴输出

115

加速度计-Y轴输出

64180

加速度计X轴输出

-36

陀螺仪Z轴输出

8

陀螺仪-Y轴输出

-941

陀螺仪X轴输出

IMR文件格式

Waypoint将所有自定义IMU原始二进制格式转换为通用格式(IMR),该格式在IMU数据转换器中的解码过程后从惯性探测器读取。由于它包含读取和解码数据的重要信息,通用IMU数据格式的前512个字节是一个必须填写、读取和解释的标头。在C/C++结构定义中,通用格式头包含以下字段:

IMR 文件头结构定义

Word

Size (bytes)

Type

Description

szHeader

8

char[8]

“$IMURAW0” – NULL terminated ASCII string

bIsIntelOrMotorola

1

int8_t

0 = Intel (Little Endian), default1 = Motorola (Big Endian)

bDeltaTheta

4

int32_t

0 = Data to follow will be read as scaled angular rates 1 = (default), data to follow will be read as delta thetas, meaning angular increments (i.e. scale and multiply by dDataRateHz to get degrees/second)

bDeltaVelocity

4

int32_t

0 = Data to follow will be read as scaled accelerations 1 = (default), data to follow will be read as delta velocities, meaning velocity increments (i.e. scale and multiply by dDataRateHz to get m/s2)

dDataRateHz

8

double

The data rate of the IMU in Hz. e.g. 0.01 second data rate is 100 Hz

dGyroScaleFactor

8

double

If bDeltaTheta == 0, multiply the gyro measurements by this to get degrees/second If bDeltaTheta == 1, multiply the gyro measurements by this to get degrees, then multiply by dDataRateHz to get degrees/second

dAccelScaleFactor

8

double

If bDeltaVelocity == 0, multiply the accel measurements by this to get m/s2 If bDeltaVelocity == 1, multiply the accel measurements by this to get m/s, then multiply by dDataRateHz to get m/s2

iUtcOrGpsTime

4

int32_t

Defines the time tags as GPS or UTC seconds of the week 0 = Unknown, will default to GPS 1 = Time tags are UTC seconds of week 2 = Time tags are GPS seconds of week

iRcvTimeOrCorrTime

4

int32_t

Defines whether the time tags are on the nominal top of the second or are corrected for receiver time bias

dTimeTagBias

8

double

If you have a known bias between your GPS and IMU time tags enter it here

szImuName

32

char[32]

Name of the IMU being used

reserved1

4

uint8_t[4]

Reserved for future use

szProgramName

32

char[32]

Name of calling program

tCreate

12

time_type

Creation time of file

bLeverArmValid

1

bool

True if lever arms from IMU to primary GNSS antenna are stored in this header

IXoffset

4

int32_t

X value of the lever arm, in millimeters

IYoffset

4

int32_t

Y value of the lever arm, in millimeters

C++源代码
(1) 头文件

#pragma once
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<sstream>
#include<algorithm>
#include<map>
#include<list>
#include<ctime>
#include<filesystem>#define EPSILON             2.2204460492503131e-016                 ///< epsilon == DBL_EPSILON
#define isEqual(a,b)        (fabs(a-b)<EPSILON ? true : false)      ///< a == busing namespace std;class INS_Solver
{
public:struct ImuConfigure{double acc_conversion_factor;//加速度计转换系数double gyro_conversion_factor;//陀螺仪转换系数double freq;};// IMU data structurestruct IMUData{int gpsweek;double secofweek;double ax;double ay;double az;double gx;double gy;double gz;};#pragma pack(push, 1) // IMR header structuretypedef struct{short int year;short int month;short int day;short int hour;short int minute;short int second;} time_type;typedef struct{double dVersionNumber;		       ///< Program version number (i.e. 8.20)double dDataRateHz;			       ///< i.e. 100.0 records/second. If you do not know it, set this to zero///< and then fill it in from the interface dialog boxesdouble dGyrosScaleFactor;	       ///< Scale (multiply) the gyro measurements by this to get degrees/sec,///< if bDeltaTheta=0. Scale the gyros by this to get degrees, if///< bDeltaTheta =1. If you do not know it, then the data can not be///< processed. Our default is to store the gyro data in 0.01 arcsec///< increments or 0.01 arcsec/sec, so that GYRO_SCALE = 360000(Needed)double dAccelScaleFactor;	       ///< Scale (multiply) the accel measurements by this to get m/s2///< if bDeltaVelocity=0. Scale the accels by this to get m/s, if///< bDeltaVelocity =1. If you do not know it, the data can not be///< processed. Our default is to store the accel data in 1e-6 m/s///< increments or 1e-6 m/s2, so that ACCEL_SCALE = 1000000(Needed)double dTimeTagBias;	           ///< default is 0.0, but if you have a known millisecond-level bias in///< in your GPS..INS time tags, then enter it hereint bDeltaTheta;		           ///< Default is 1, which indicates the data to follow will be delta///< thetas, meaning angular increments (i.e. scale and divide by///< by dDataRateHz to get degrees/second). If the flag is set to 0, then///< the data will be read directly as scaled angular rates///< Comment:0-angular rate,1-angular increment(Needed)int bDeltaVelocity;			       ///< Default is 1, which indicates the data to follow will be delta v's,///< meaning velocity increments (i.e. scale and divide by///< dDataRateHz to get m/s2). If the flag is set to 0, then the data will///< be read directly as scaled accelerations///< Comment:0-angular rate,1-angular increment(Needed)int iUtcOrGpsTime;			       ///< Defines the time-tags as being in UTC or GPS seconds of the week///< 0 every Unknown (default is GPS), 1 every UTC, 2 every GPSint iRcvTimeOrCorrTime;		       ///< Defines whether the GPS time-tags are on the nominal top of the///< second or are corrected for receiver time bias///< 0 - do not know (default is corrected time)///< 1 - receive time on the nominal top of the epoch///< 2 - corrected time i.e. corr_time = rcv_time - rcvr_clock_biasint  lXoffset;				       ///< X value of lever arm, in millimetersint  lYoffset;				       ///< Y value of lever arm, in millimetersint  lZoffset;				       ///< Z value of lever arm, in millimeterstime_type tCreate;		           ///< Creation time; skip if writing directly to this format (12 bytes)char szImuName[32];			       ///< Name or type of inertial unit that is being usedbool bDirValid;					   ///< Set to true if the sensor definition that follows is valid///< Skip if writing directly to this formatunsigned char ucX;		           ///< Direction of X-axis; skip if writing directly to this formatunsigned char ucY;		           ///< Direction of Y-axis; skip if writing directly to this formatunsigned char ucZ;			       ///< Direction of Z-axis; skip if writing directly to this formatchar szProgramName[32];  	       ///< Name of calling program; skip if writing directly to this formatbool bLeverArmValid;	           ///< Set to true if the sensor definition that follows is valid///< Lever arm is from IMU to GPS phase centrechar szHeader[8];			       ///< $IMURAW[\0] - NULL terminated ASCII stringchar bIsIntelOrMotorola;	       ///< 0 every Intel (Little Endian) - default///< 1 every Motorola (Big Endian) - swap bytes for IExplorer///< This can be set for any user who directly writes in our///< format with a Big Endian processor. IExplorer will swap the byteschar Reserved[354];		           ///< Reserved for future use; bytes should be zeroed} INS_HEAD;typedef struct{double Time;				       int gx, gy, gz;				      int ax, ay, az;				       } INS_DATA;	                   
#pragma pack(pop)ImuConfigure imuconfig;vector<IMUData> ImuData;void Read_IMU_ASCLL(string filename,int k);//读取ASCLL格式的惯导文件void Read_IMU_IMR(string IMRFile, INS_HEAD m_FFSHead, list<IMUData> m_AllDataRecords);//读取imr格式的惯导文件void imufile_ascll2imr(string file_ascll);void ascll2type2(string file_ascll);void ReadConfig(string filename);//读取配置文件void AllanAlalysis(string Allan_file);//Allan方差分析bool readFFSHead(FILE* m_fp, INS_HEAD& m_FFSHead);bool readFFSBody(FILE *m_fp, IMUData& insData, INS_HEAD& m_FFSHead, list<IMUData>& m_AllDataRecords);
};

(2)函数模块

#include"INS.h"/*读取IMU解算配置文件------------------------------------------------
输入:配置文件
输出:配置结构体
-------------------------------------------------------------------*/
void INS_Solver::ReadConfig(string filename)
{ifstream file(filename);if (!file.is_open()) {runtime_error("无法打开配置文件: " + filename);}string line;while (getline(file, line)){// 跳过空行和注释if (line.empty() || line[0] == '#') continue;// 查找分隔符":"(中文冒号)size_t pos = line.find(":");if (pos == string::npos){cerr << "警告: 格式错误的行 - " << line << std::endl;continue;}// 提取键和值string key = line.substr(0, pos);string value = line.substr(pos + 1);// 去除前后空格key.erase(0, key.find_first_not_of(" \t"));key.erase(key.find_last_not_of(" \t") + 1);value.erase(0, value.find_first_not_of(" \t"));value.erase(value.find_last_not_of(" \t") + 1);if (key == "Accelerometer conversion factor"){imuconfig.acc_conversion_factor = stod(value);}if (key == "Gyroscope conversion factor"){imuconfig.gyro_conversion_factor = stod(value);}if (key == "frequency"){imuconfig.freq = stod(value);}}
}// 分割字符串函数
vector<string> split(string &s, char delimiter)
{vector<string> tokens;string token;istringstream tokenStream(s);while (getline(tokenStream, token, delimiter)){if (!token.empty()){tokens.push_back(token);}}return tokens;
}/*读取ASCLL格式的RAWIMU文件------------------------------------------
输入:IMU文件名
输出:IMU数据结构体
-------------------------------------------------------------------*/
void INS_Solver::Read_IMU_ASCLL(string filename,int k)
{IMUData imudata_current;ImuData.reserve(450000);ifstream infile(filename);if (!infile.is_open()){cerr << "The file " << filename << " is not exsist!" << endl;}while (!infile.eof()){string line;getline(infile, line);if (line.find("%RAWIMUSXA") == 0){// 去掉校验部分(最后一个*后面的内容)int asterisk_pos = line.find_last_of('*');string data_part = line.substr(0, asterisk_pos);// 处理分号分割的部分int semicolon_pos = data_part.find(';');string part_before_semicolon = data_part.substr(0, semicolon_pos);string part_after_semicolon = data_part.substr(semicolon_pos + 1);// 解析分号前的部分vector<string> before_semicolon = split(part_before_semicolon, ',');if (before_semicolon.size() >= 3) {imudata_current.gpsweek = stoi(before_semicolon[1]);imudata_current.secofweek = stod(before_semicolon[2]);}// 解析分号后的部分vector<string> after_semicolon = split(part_after_semicolon, ',');if (k == 0){imudata_current.az = stoi(after_semicolon[5])*imuconfig.acc_conversion_factor*imuconfig.freq;imudata_current.ay = (-1)*stoi(after_semicolon[6])*imuconfig.acc_conversion_factor*imuconfig.freq;imudata_current.ax = stoi(after_semicolon[7])*imuconfig.acc_conversion_factor*imuconfig.freq;imudata_current.gz = stoi(after_semicolon[8])*imuconfig.gyro_conversion_factor*imuconfig.freq;imudata_current.gy = (-1)*stoi(after_semicolon[9])*imuconfig.gyro_conversion_factor*imuconfig.freq;imudata_current.gx = stoi(after_semicolon[10])*imuconfig.gyro_conversion_factor*imuconfig.freq;}else{imudata_current.az = stoi(after_semicolon[5]);imudata_current.ay = (-1)*stoi(after_semicolon[6]);imudata_current.ax = stoi(after_semicolon[7]);imudata_current.gz = stoi(after_semicolon[8]);imudata_current.gy = (-1)*stoi(after_semicolon[9]);imudata_current.gx = stoi(after_semicolon[10]);}ImuData.push_back(imudata_current);cout << ImuData.size() << endl;}//if (ImuData.size() > 1000)//{//	break;//}};
}bool INS_Solver::readFFSHead(FILE* m_fp, INS_HEAD& m_FFSHead)
{// Read IMR File Head Partfread(&m_FFSHead.szHeader, sizeof(char), 8, m_fp);fread(&m_FFSHead.bIsIntelOrMotorola, sizeof(char), 1, m_fp);fread(&m_FFSHead.dVersionNumber, sizeof(double), 1, m_fp);fread(&m_FFSHead.bDeltaTheta, sizeof(int), 1, m_fp);fread(&m_FFSHead.bDeltaVelocity, sizeof(int), 1, m_fp);fread(&m_FFSHead.dDataRateHz, sizeof(double), 1, m_fp);fread(&m_FFSHead.dGyrosScaleFactor, sizeof(double), 1, m_fp);fread(&m_FFSHead.dAccelScaleFactor, sizeof(double), 1, m_fp);fread(&m_FFSHead.iUtcOrGpsTime, sizeof(int), 1, m_fp);fread(&m_FFSHead.iRcvTimeOrCorrTime, sizeof(int), 1, m_fp);fread(&m_FFSHead.dTimeTagBias, sizeof(double), 1, m_fp);fread(&m_FFSHead.szImuName, sizeof(char), 32, m_fp);fread(&m_FFSHead.bDirValid, sizeof(bool), 1, m_fp);fread(&m_FFSHead.ucX, sizeof(unsigned char), 1, m_fp);fread(&m_FFSHead.ucY, sizeof(unsigned char), 1, m_fp);fread(&m_FFSHead.ucZ, sizeof(unsigned char), 1, m_fp);fread(&m_FFSHead.szProgramName, sizeof(char), 32, m_fp);fread(&m_FFSHead.tCreate, sizeof(time_type), 1, m_fp);if (m_FFSHead.tCreate.year < 50)m_FFSHead.tCreate.year += 2000;elsem_FFSHead.tCreate.year += 1900;fread(&m_FFSHead.bLeverArmValid, sizeof(bool), 1, m_fp);fread(&m_FFSHead.lXoffset, sizeof(int), 1, m_fp);fread(&m_FFSHead.lYoffset, sizeof(int), 1, m_fp);fread(&m_FFSHead.lZoffset, sizeof(int), 1, m_fp);fread(&m_FFSHead.Reserved, sizeof(bool), 354, m_fp);return true;
}bool INS_Solver::readFFSBody(FILE *m_fp, IMUData& insData, INS_HEAD &m_FFSHead, list<IMUData>& m_AllDataRecords)
{double dt = 0.0;map<double, int> dts;double tow_pre = 0.0;double tow = 0.0;double gtPre = 0.0;while (!feof(m_fp)){INS_DATA imrData;fread(&tow, sizeof(double), 1, m_fp);fread(&imrData.gx, sizeof(int), 1, m_fp);fread(&imrData.gy, sizeof(int), 1, m_fp);fread(&imrData.gz, sizeof(int), 1, m_fp);fread(&imrData.ax, sizeof(int), 1, m_fp);fread(&imrData.ay, sizeof(int), 1, m_fp);fread(&imrData.az, sizeof(int), 1, m_fp);if (tow > 604800) tow -= 604800;// Cross GPS weekif (tow_pre != 0.0 && fabs(tow - tow_pre) > 604700){string msg("IMU data time exceeds one weeek.\n");printf(msg.c_str());}tow_pre = tow;// The unit of outputs (gx, gy, gz) for imr files is deg/sinsData.secofweek = tow;insData.gx = imrData.gx * m_FFSHead.dGyrosScaleFactor * m_FFSHead.dDataRateHz;insData.gy = imrData.gy * m_FFSHead.dGyrosScaleFactor * m_FFSHead.dDataRateHz;insData.gz = imrData.gz * m_FFSHead.dGyrosScaleFactor * m_FFSHead.dDataRateHz;insData.ax = imrData.ax * m_FFSHead.dAccelScaleFactor * m_FFSHead.dDataRateHz;insData.ay = imrData.ay * m_FFSHead.dAccelScaleFactor * m_FFSHead.dDataRateHz;insData.az = imrData.az * m_FFSHead.dAccelScaleFactor * m_FFSHead.dDataRateHz;// Correct the time offsetinsData.secofweek -= (m_FFSHead.dTimeTagBias * 0.001);if (insData.secofweek > gtPre){m_AllDataRecords.push_back(insData);gtPre = insData.secofweek;}else if (isEqual(insData.secofweek, gtPre)){char msg[1024] = { '\0' };snprintf(msg, sizeof(msg), "IMU data: data duplication --- %.4f.\n", insData.secofweek);printf(msg);}else{char msg[1024] = { '\0' };snprintf(msg, sizeof(msg), "IMU data: previous %.4f is greater than current %.4f.\n", gtPre, insData.secofweek);printf(msg);}}return true;
}/*读取IMR文件格式的惯导原始数据---------------------------------------
输入:IMR文件名
输出:IMR文件头和惯导数据
--------------------------------------------------------------------*/
void INS_Solver::Read_IMU_IMR(string IMRFile, INS_HEAD m_FFSHead, list<IMUData> m_AllDataRecords)
{FILE* m_fp = nullptr;errno_t err = fopen_s(&m_fp, IMRFile.c_str(), "rb");if (err != 0 || m_fp == nullptr){string msg = "IMR file wrong! File path --- " + IMRFile;printf(msg.c_str());return;}IMUData insData;readFFSHead(m_fp, m_FFSHead);readFFSBody(m_fp, insData, m_FFSHead, m_AllDataRecords);cout << "IMR file is read!" << endl;
}/*将ASCLL文件格式的惯导原始数据转换为imr格式--------------------------
输入:ascll文件
输出:imr文件
--------------------------------------------------------------------*/
void INS_Solver::imufile_ascll2imr(string file_ascll)
{Read_IMU_ASCLL(file_ascll, 1); // 读取ASCII数据if (ImuData.size() < 2){throw runtime_error("Insufficient IMU data points");}// 计算平均采样率double freq = imuconfig.freq;// 生成输出文件名size_t last_dot = file_ascll.find_last_of(".");string file_imr = (last_dot != string::npos) ?file_ascll.substr(0, last_dot) + ".imr" :file_ascll + ".imr";FILE* outfile = nullptr;if (fopen_s(&outfile, file_imr.c_str(), "wb") != 0 || !outfile){throw runtime_error("Cannot open output file: " + file_imr);}// 逐个字段写入文件头// 确保字符串正确终止并精确写入指定长度const char header_id[] = "$IMURAM0";fwrite(header_id, sizeof(char), 8, outfile);  // 精确写入8字节char endian = 0;  // 小端序fwrite(&endian, sizeof(char), 1, outfile);double version = 8.80;fwrite(&version, sizeof(double), 1, outfile);int delta_theta = 1;fwrite(&delta_theta, sizeof(int), 1, outfile);int delta_velocity = 1;fwrite(&delta_velocity, sizeof(int), 1, outfile);fwrite(&freq, sizeof(double), 1, outfile);fwrite(&imuconfig.gyro_conversion_factor, sizeof(double), 1, outfile);fwrite(&imuconfig.acc_conversion_factor, sizeof(double), 1, outfile);int time_type = 2;  // GPS时间fwrite(&time_type, sizeof(int), 1, outfile);int time_corr = 2;  // 校正时间fwrite(&time_corr, sizeof(int), 1, outfile);double time_bias = 0.0;fwrite(&time_bias, sizeof(double), 1, outfile);// 写入IMU名称(精确32字节)const char imu_name[32] = "IMU_NAME";fwrite(imu_name, sizeof(char), 32, outfile);bool dir_valid = false;fwrite(&dir_valid, sizeof(bool), 1, outfile);unsigned char axis_x = 'X';fwrite(&axis_x, sizeof(unsigned char), 1, outfile);unsigned char axis_y = 'Y';fwrite(&axis_y, sizeof(unsigned char), 1, outfile);unsigned char axis_z = 'Z';fwrite(&axis_z, sizeof(unsigned char), 1, outfile);// 写入程序名称(精确32字节)const char program_name[32] = "ASCLL_to_IMR_Converter";fwrite(program_name, sizeof(char), 32, outfile);// 写入创建时间time_t now = time(nullptr);struct tm tm_now;if (gmtime_s(&tm_now, &now) == 0){short int year = static_cast<short int>(tm_now.tm_year + 1900);short int month = static_cast<short int>(tm_now.tm_mon + 1);short int day = static_cast<short int>(tm_now.tm_mday);short int hour = static_cast<short int>(tm_now.tm_hour);short int minute = static_cast<short int>(tm_now.tm_min);short int second = static_cast<short int>(tm_now.tm_sec);fwrite(&year, sizeof(short int), 1, outfile);fwrite(&month, sizeof(short int), 1, outfile);fwrite(&day, sizeof(short int), 1, outfile);fwrite(&hour, sizeof(short int), 1, outfile);fwrite(&minute, sizeof(short int), 1, outfile);fwrite(&second, sizeof(short int), 1, outfile);}else{// 如果获取时间失败,写入默认值short int zero = 0;for (int i = 0; i < 6; i++)fwrite(&zero, sizeof(short int), 1, outfile);}bool lever_valid = false;fwrite(&lever_valid, sizeof(bool), 1, outfile);int offset_zero = 0;fwrite(&offset_zero, sizeof(int), 1, outfile);  // X偏移fwrite(&offset_zero, sizeof(int), 1, outfile);  // Y偏移fwrite(&offset_zero, sizeof(int), 1, outfile);  // Z偏移// 写入保留字段(354字节全零)char reserved[354] = { 0 };fwrite(reserved, sizeof(char), 354, outfile);// 逐个字段写入数据记录const int MAX_INT = numeric_limits<int>::max();const int MIN_INT = numeric_limits<int>::min();for (const auto& imu : ImuData){// 写入时间double time_val = imu.secofweek;fwrite(&time_val, sizeof(double), 1, outfile);// 确保数据在int范围内并写入auto write_clamped = [&](double value){int clamped = (value > MAX_INT) ? MAX_INT :(value < MIN_INT) ? MIN_INT :static_cast<int>(value);fwrite(&clamped, sizeof(int), 1, outfile);};// 写入传感器数据write_clamped(imu.gx);write_clamped(imu.gy);write_clamped(imu.gz);write_clamped(imu.ax);write_clamped(imu.ay);write_clamped(imu.az);}fclose(outfile);cout << "Successfully converted to: " << file_imr<< " with " << ImuData.size() << " records" << endl;ImuData.clear();
}void INS_Solver::ascll2type2(string file_ascll)
{Read_IMU_ASCLL(file_ascll, 1); // 读取ASCII数据// 生成输出文件名size_t last_dot = file_ascll.find_last_of(".");string file_imr = (last_dot != string::npos) ?file_ascll.substr(0, last_dot) + ".txt" :file_ascll + ".txt";ofstream outfile(file_imr);for (const auto& imu : ImuData){outfile << imu.secofweek << " " << imu.ax << " " << imu.ay << " " << imu.az << " " << imu.gx << " " << imu.gy << " " << imu.gz << endl;}outfile.close();
}

欢迎大家和我交流!


http://www.hkcw.cn/article/yWFtDZAxOs.shtml

相关文章

电脑为什么换个ip就上不了网了

在日常使用电脑上网时&#xff0c;很多人可能遇到过这样的问题&#xff1a;当IP地址发生变化后&#xff0c;突然就无法连接网络了。当电脑更换IP地址后无法上网&#xff0c;这一现象可能由多种因素导致&#xff0c;涉及网络配置、硬件限制或运营商策略等层面。以下是系统性分析…

动中通天线跟踪性能指标的测试

卫星通信动中通天线包括天线、卫星信号跟踪接收机、GNSS接收机&#xff08;含天线&#xff09;、组合导航设备、天线控制器、伺服结构以及其他射频组件等。其中&#xff1a; • GNSS接收机提供系统位置信息&#xff1b; • 组合导航设备提供天线所在平台的方位、俯仰、横滚姿态…

从 GPT 的发展看大模型的演进

这是一个技术爆炸的时代。一起来看看 GPT 诞生后&#xff0c;与BERT 的角逐。 BERT 和 GPT 是基于 Transformer 模型架构的两种不同类型的预训练语言模型。它们之间的角逐可以从 Transformer 的编码解码结构角度来分析。 BERT&#xff08;Bidirectional Encoder Representatio…

Charles青花瓷抓取外网数据包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; Charles有一个问题&#xff0c;开启翻墙工具后会发现无法进行抓包&#xff0c;这是需要做额外的配置才可以 首选选择下图中的External Proxy Settings 然后如下…

在考古方向遥遥领先的高校课程建设-250602

解决方案&#xff1a;全栈自学&#xff0c;全栈自研&#xff0c;独立自主。 全文AI…… 每代人的智商和注意力差异是如何出现的-250602-CSDN博客 网络还是有这些内容的&#xff1a; 考古教育之殇&#xff1a;高校课程建设的滞后与困境 在考古学这一承载着人类文明密码与历史记…

K-匿名模型

K-匿名模型是隐私保护领域的一项基础技术&#xff0c;防止通过链接攻击从公开数据中重新识别特定个体。其核心思想是让每个个体在发布的数据中“隐匿于人群”&#xff0c;确保任意一条记录至少与其他K-1条记录在准标识符&#xff08;Quasi-Identifiers, QIDs&#xff09;上不可…

BUUCTF[极客大挑战 2019]EasySQL 1题解

[极客大挑战 2019]EasySQL题解 分析解题过程漏洞原理分析明确注入点&#xff1a;尝试万能密码法法一法二 总结 分析 从题目分析&#xff0c;这道题应该与SQL注入有关&#xff0c;启动靶机之后&#xff0c;访问url是一个登录界面&#xff0c;随便输入用户名密码之后&#xff0…

8088单板机C语言项目计划表

Prj1 原来第一版8088单板机C语言实现版 用Nmake 和 Makefile编译方式实现的 略显复杂 Prj2 8088单板机C语言实现LED灯闪烁控制 Prj3 8088单板机C语言串口实现“Hellow World&#xff01;” Prj4 8088单板机C语言串口实现格式化sprintf&#xff08;&#x…

【电赛培训课程】测量与信号类赛题知识点讲解与赛题解析

一、三极管基础知识 1.基本运行规则 ICE βIBEUBE 0.7V 2.什么时候选择使用三极管而不是运算放大器 不需要精确的放大倍数&#xff08;交流放大&#xff09;题目指定 3.优点 不容易产生自激振荡&#xff0c;在相同的频率下更不容易失真便宜量大管够 二、三极管放大电路…

学到新的日志方法mp

使用mp技术的时候可以在类上加上注解Slf4j 就可以使用日志 不需要在定义变量log,注意日志只能在方法内使用&#xff0c;不能在方法外进行使用

Linux入门(十三)动态监控系统监控网络状态

top与ps 命令很相似&#xff0c;它们都是用来显示正在执行的进程&#xff0c;top与ps大的区别是top在执行一段时间可以更新正在运行的进程。 #-d 更新秒数 如果不写-d 那默认是3秒更新 # -i 隐藏不活跃进程 top -d 5交互操作 P 按cpu使用大小排序&#xff0c;默认此项 M 按内存…

SolidWorks建模(U盘)- 多实体建模拆图案例

这个U盘模型并不是一个多装配体&#xff0c;它是一个多实体零件&#xff0c;它是在零件模式下创建的这些多实体的零部件。按右键解除爆炸就可以装配到一起&#xff0c;再按右键爆炸&#xff0c;就能按照之前移动的位置进行炸开 爆炸视图直接展示 模型案例和素材或取&#xff08…

【C++高级主题】转换与多个基类

目录 一、多重继承的虚函数表结构&#xff1a;每个基类一个虚表 1.1 单继承与多重继承的虚表差异 1.2 代码示例&#xff1a;多重继承的虚函数覆盖 1.3 虚表结构示意图 二、指针与引用的类型转换&#xff1a;地址调整的底层逻辑 2.1 派生类指针转基类指针的地址偏移 2.2 …

论文写作核心要点

不要只读论文里的motivation和method 论文里的图表和统计特征 在论文里找到具有统计意义的东西&#xff0c;那么在语料里也肯定遵循这样的规律&#xff0c;我们就能用机器学习的方法&#xff0c; 我们再用不同方法解决&#xff0c;哪种方法好&#xff0c;就用哪种 实验分析 …

Hadoop 大数据启蒙:深入解析分布式基石 HDFS

Hadoop 大数据启蒙&#xff1a;深入解析分布式基石 HDFS 分布式存储的本质&#xff1a;用廉价机器集群解决海量数据的存储与容错问题 一、为什么需要 HDFS&#xff1f; 当数据规模突破单机极限&#xff08;如 PB 级&#xff09;&#xff0c;传统存储面临核心瓶颈&#xff1a; …

ShenNiusModularity项目源码学习(33:ShenNius.Admin.Mvc项目分析-18)

文章管理页面用于搜索、新建、维护及删除CMS管理模块的文章信息&#xff0c;包括栏目名称、文章标题、作者等数据。文章管理页面的后台控制器类ArticleController位于ShenNius.Admin.Mvc项目的Areas\Cms\Controllers内&#xff0c;页面文件位于同项目的Areas\Cms\Views\Article…

模型训练的“隐形杀手”——过拟合!全面解析与实用应对方案

在机器学习和深度学习的实践中&#xff0c;“过拟合”&#xff08;Overfitting&#xff09;是一个我们经常会遇到且需要重点关注的问题。它直接关系到模型的泛化能力和实际应用效果。本文将带你深入浅出地理解什么是过拟合&#xff0c;分析其在大模型时代的特点、产生原因&…

新版智慧社区(小区)智能化弱电系统解决方案

该方案聚焦新版智慧社区智能化弱电系统建设,以物联网、云计算、AI 人脸识别等技术为支撑,构建涵盖智能可视化对讲、智慧门禁、智能梯控、智慧停车、视频监控等核心系统的社区智能化体系,并通过智慧社区集成平台实现设备管理、数据统计、预警联动等功能。方案旨在解决传统社区…

【C++高级主题】多重继承

目录 一、多重继承的定义与语法 1.1 基本语法 1.2 多重继承应用场景 二、状态继承&#xff1a;派生类如何继承多个基类的状态 2.1 内存布局&#xff1a;每个基类都是独立的子对象 2.2 代码验证&#xff1a;访问基类成员 三、构造函数与析构函数的顺序 3.1 构造函数的调…

【Spring底层分析】Spring AOP基本使用+万字底层源码阅读分析

一、AOP基本使用 三步&#xff1a; 将业务逻辑组件和切面类都加入到容器中&#xff0c;告诉Spring哪个是切面类&#xff08;Aspect&#xff09;在切面类上的每一个通知方法上标注通知注解&#xff0c;告诉Spring何时&#xff08;Before、After、Around……&#xff09;何地运…