当前位置: 首页 > news >正文

Visual Studio C# 处理和修复 WinRiver II 测量项目 MMT 文件错误

Visual Studio C# 处理和修复 WinRiver II 测量项目 MMT 文件错误

  • 前言
  • 一、WinRiver II 测量项目 MMT 文件的结构
  • 二、WinRiver II 无法打开或操作测量项目 MMT 文件
    • 2.1 无法载入船测多线法测量文件
    • 2.2 可以载入测验项目 MMT 文件,但 ADCP 后处理软件无法写入信息
    • 2.3 无法打开或操作测量项目 MMT 文件的原因
  • 三、符合与违反 XML 文件规则的字符
    • 3.1、符合规则的单字节的英语字母和符号(0-9、a-z、A-Z、+-*/<>[]等)
    • 3.2、符合规则的双字节的阿拉伯字母和符号
    • 3.3、符合规则的三字节的UTF-8 编码字符(UTF-8 编码的汉字或其它区域文字)
    • 3.4、常见违反 XML 规则的非法字符
    • 3.5、违反 XML 规则非法字符的替代字符
  • 四、测量项目 MMT 文件常见错误内容
    • 4.1 测站信息区域中文字段容易出现非法字符
    • 4.2 QA/QC ADCP 测试区域字段容易出现非法字符
  • 五、Visual Studio C# 处理和修复 WinRiver II 测量项目 MMT 文件错误
    • 5.1 引入类(空间名称)
    • 5.2 处理和修复 MMT 文件错误的代码主体

前言

WinRiver II 测量项目文件扩展名为 MMT,是声学多普勒流速剖面仪(简称 ADCP )测量软件 WinRiver II 的测量项目文件,是现代水域剖面流量测验的重要技术方法。

一、WinRiver II 测量项目 MMT 文件的结构

WinRiver II 测量项目 MMT 文件的结构实际是 XML 结构,遵循 XML 标准,文件编码是 UTF-8 LE (无 BOM ),文件结构如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<WinRiver><Project Name="bs20240418_1.mmt" Version="1.0.0.2" Flags="0"><Locked>False</Locked><Site_Information Type="1" Checked="1" Status="0" Error="0"><Agency>长江勘测局</Agency><Country>中国</Country><State>湖北省</State><County>武汉市</County><District>江岸镇</District><HydrologicUnit>长江水文局</HydrologicUnit><Party>江岸分局</Party><BoatMotorUsed>水文668快艇</BoatMotorUsed><ProcessedBy>赵钱孙</ProcessedBy><ADCPSerialNmb>21924</ADCPSerialNmb><Description>江岸村</Description><Grid_Reference>长江</Grid_Reference><Number>61500001</Number><Name>白沙(二)</Name><River_Name>长江干流</River_Name><Measurement_Date>04/18/2024</Measurement_Date><Rating_Number>1</Rating_Number><Wind_Speed>2</Wind_Speed><Wind_Direction>S</Wind_Direction><Edge_Measurement_Method> </Edge_Measurement_Method><Magnetic_Var_Method>模型</Magnetic_Var_Method><Measurement_Rating>(2%)</Measurement_Rating><ControlCode1>4-畅流</ControlCode1><ControlCode2>7-杂物量少</ControlCode2><ControlCode3>9-水生植物量少</ControlCode3><MeasurementNmb>1</MeasurementNmb><Remarks>2S  p8 0.14</Remarks><TimeZone>中国夏令</TimeZone><DeploymentType>0</DeploymentType><Use_Inside_Gage_Height>1</Use_Inside_Gage_Height><Magnetic_Var_Method_Index>1</Magnetic_Var_Method_Index><Measurement_Rating_Index>1</Measurement_Rating_Index><ControlCode1_Index>3</ControlCode1_Index><ControlCode2_Index>6</ControlCode2_Index><ControlCode3_Index>8</ControlCode3_Index><Inside_Gage_Height>30.310000</Inside_Gage_Height><Outside_Gage_Height>0.000000</Outside_Gage_Height><Gage_Height_Change>0.000000</Gage_Height_Change><Rating_Discharge>0.000000</Rating_Discharge><Index_Velocity>0.000000</Index_Velocity><Rated_Area>0.000000</Rated_Area><Water_Temperature>-32768.000000</Water_Temperature><Tail_Water_Level>30.310000</Tail_Water_Level><Reference>BT</Reference><Use_Old_Sidelobe_Method>0</Use_Old_Sidelobe_Method></Site_Information><Site_Discharge Type="2" Checked="1" Status="0" Error="0"><!-- 省略...... --></Site_Discharge><QA_QC Type="3" Checked="1" Status="0" Error="0"><!-- 省略...... --></QA_QC><Collect_Data Type="4" Checked="1" Status="0" Error="0"><!-- 省略...... --></Collect_Data><DisplaySettings><Globals><Depth_Max>15.000000</Depth_Max></Globals></DisplaySettings></Project>
</WinRiver>

二、WinRiver II 无法打开或操作测量项目 MMT 文件

当 WinRiver II 测验完成,进行后处理时,有时候发现无法打开或载入测验项目 MMT 文件。

2.1 无法载入船测多线法测量文件

在这里插入图片描述

2.2 可以载入测验项目 MMT 文件,但 ADCP 后处理软件无法写入信息

在 ADCP 后处理软件进行计算后,无法写入准确的水边距等信息

2.3 无法打开或操作测量项目 MMT 文件的原因

无法打开或操作测量项目 MMT 文件的原因是 MMT 文件写入了违反 XML 规则的字符

A、测验工作时,外围设备 USB 串口接触不良、屏蔽不良
B、测验完成后,WinRiver II 软件没有正常退出
C、测验完成后,WinRiver II 软件没有关闭测量模式进行了违规操作
D、测验完成后,WinRiver II 软件回放数据进行编辑操作时,外围设备 USB 串口没有正常拨出
E、WinRiver II 软件可能存在 UTF-8 中文处理不严谨的 BUG
F、使用记事本的 ANSI 编码打开和编辑了 UTF-8 编码的测量项目 MMT 文件,导致 UTF-8 编码异常

三、符合与违反 XML 文件规则的字符

3.1、符合规则的单字节的英语字母和符号(0-9、a-z、A-Z、±*/<>[]等)

常见数字、字母的十六进制:

字母或符号十六进制
0-9\x30、\x31、\x32、\x33、\x34、\x35、\x36、\x37、\x38、\x39
A-Z\x41、\x42、\x43、\x44、\x45、\x46、\x47、\x48、\x49、\x4A、\x4B、\x4C、\x4D、\x4E、\x4F、\x50 - - - -\x5A
a-z\x61、\x62、\x63、\x64、\x65、\x66、\x67、\x68、\x69、\x6A、\x6B、\x6C、\x6D、\x6E、\x6F、\x70 - - - -\x7A
空格 ! 双引号 “\x20、\x21、\x22
# $ % & ’ ( ) * + , - . /\x23、\x24、\x25、\x26、\x27、\x28、\x29、\x2A、\x2B、\x2C、\x2D、\x2E、\x2F
: ; < = > ? @\x3A、\x3B、\x3C、\x3D、\x3E、\x3F、\x40
[ \ ] ^ _ `\x5B、\x5C、\x5D、\x5E、\x5F、\x60
{ | } ~\x7B、\x7C、\x7D、\x7E
常用控制符十六进制
Tab 制表符\x09
换行符\x0A
回车符\x0D

3.2、符合规则的双字节的阿拉伯字母和符号

3.3、符合规则的三字节的UTF-8 编码字符(UTF-8 编码的汉字或其它区域文字)

3.4、常见违反 XML 规则的非法字符

常见导致 XML 无法正常载入的非法字符,以十六进制表示:

非法字符范围十六进制
\x0-\x8、\x0B-\x0C\x00、\x01、\x02、\x03、\x04、\x05、\x06、\x07、\x08、\x0B、\x0C
\x0E-\x1F\x0E、\x0F、\x10、\x11、\x12、\x13、\x14、\x15、\x16、\x17、\x18、\x19、\x1A、\x1B、\x1C、\x1D、\x1E、\x1F
\xD800 - \xDFFFxD800、xD801、xD802、xD803、xD804、xD805、xD806、xD807、xD808、xD809、xD80A、…、xDFFE、\xDFFF
\xFFFD - \xFFFF\xFFFD、\xFFFE、\xFFFF

3.5、违反 XML 规则非法字符的替代字符

非法字符十六进制 EF BF BD 通常是因为在处理包含UTF-8编码的XML文件时遇到了无法识别的字节序列。十六进制 EF BF BD 是UTF-8编码中的“替代字符”(�),它通常表示数据在解码时遇到了问题。当载入XML 文件中有 UTF-8 编码中的“替代字符”,也是存在 XML 无法识别的字节。

四、测量项目 MMT 文件常见错误内容

4.1 测站信息区域中文字段容易出现非法字符

在这里插入图片描述
由上图可见,黑色标注块出现了非法字符。当出现这类情况,原有 UTF-8 编码的中文出现错误,同时引起 XML 《开始标签》没有相应匹配的《结束标签》,如上图 < State > 没有匹配的结束标签 < /State >、< County > 没有匹配的结束标签 < /County > 等,或者标签缺失标志。主要原因可能是外界异常操作导致 UTF-8 编码的中文出现异常,或WinRiver II 软件可能存在 UTF-8 中文编码处理不严谨的 BUG!

4.2 QA/QC ADCP 测试区域字段容易出现非法字符

在这里插入图片描述
由上图可见,黑色标注块是出现的非法字符,当出现这类情况,主要原因可能是外界电气接触不良 或 ADCP 串口输出了异常字符,而 WinRiver II 软件没有进行相应处理。导致出现 UTF-8 异常编码!

五、Visual Studio C# 处理和修复 WinRiver II 测量项目 MMT 文件错误

5.1 引入类(空间名称)

using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Xml;

5.2 处理和修复 MMT 文件错误的代码主体

		static readonly Encoding UTF8NoBOM = new UTF8Encoding(false);//UTF-8 LE 编码OpenFileDialog Openfiledialog = new OpenFileDialog();Openfiledialog.Filter = "ADCP项目文件(*.MMT)|*.MMT";Openfiledialog.Title = "打开 ADCP 项目 MMT 文件";Openfiledialog.FilterIndex = 0;if (Openfiledialog.ShowDialog() == DialogResult.OK){try{string MmtPathFile = Openfiledialog.FileName;string MmtFileString = File.ReadAllText(MmtPathFile, Encoding.UTF8);\\将 MMT 项目文件载入到字符串foreach (char chr in MmtFileString){int Val = Convert.ToInt32(chr);if ((Val >= 0 && Val <= 8) || (Val >= 11 && Val <= 12) || (Val >= 14 && Val <= 31) || (Val >= 55296 && Val <= 57343) || (Val >= 65533 && Val <= 65535)){MmtFileString = MmtFileString.Replace(chr, '!');\非法字符暂时用英文感叹号代替}}MmtFileString = MmtFileString.Replace("!?/", "</");//消除非法字符后,修复可能产生的 XML 标签规则异常导致的不匹配MmtFileString = MmtFileString.Replace("!?", "?");XmlDocument XMLDoc = new XmlDocument();XmlTextWriter XmlWriter = new XmlTextWriter(MmtPathFile, UTF8NoBOM);// MMT 文件采用了UTF-8 LE 无 BOM 编码XMLDoc.LoadXml(MmtFileString);XmlWriter.Formatting = Formatting.Indented; //XML缩进格式化,便于查看内容,手工修复非法字符引起的汉字缺失XMLDoc.WriteTo(XmlWriter);XmlWriter.Flush();XmlWriter.Close();MessageBox.Show("文件已经修复,请手工修复非法字符引起的汉字缺失或错误!", "消息" , MessageBoxButtons.OK);}catch (Exception ex){MessageBox.Show(ex.StackTrace, "程序内部错误: " + ex.Message, MessageBoxButtons.OK);}}	

相关文章:

Visual Studio C# 处理和修复 WinRiver II 测量项目 MMT 文件错误

Visual Studio C# 处理和修复 WinRiver II 测量项目 MMT 文件错误 前言一、WinRiver II 测量项目 MMT 文件的结构二、WinRiver II 无法打开或操作测量项目 MMT 文件2.1 无法载入船测多线法测量文件2.2 可以载入测验项目 MMT 文件&#xff0c;但 ADCP 后处理软件无法写入信息2.3…...

JAVA实现大写金额转小写金额

在金融行业中经常需要把大写金额转成小写金额&#xff0c;之前在一次开发中有个类似的需求&#xff0c;翻阅了好多博文&#xff0c;都没找到合适的&#xff0c;故没办法&#xff0c;就花了点时间研究并实现! 实现代码如下: private static final Character ZERO 零;private s…...

如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue

TOC ssm779基于SSM的宠物服务平台的设计与实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#x…...

【C++学习笔记 21】C++中的动态数组 vertor

静态数组 首先来创建一个静态数组 #include <iostream> #include <string>struct Vertex {float x, y, z; };std::ostream& operator<<(std::ostream& stream, const Vertex& vertex) {stream << vertex.x << "," <&…...

MongoDB 快速入门+单机部署(附带脚本)

目录 介绍 体系结构 数据模型 BSON BSON 数据类型 特点 高性能 高可用 高扩展 丰富的查询支持 其他特点 部署 单机部署 普通安装 脚本安装 Docker Compose 安装 卸载 停止 MongoDB 删除包 删除数据目录 参考&#xff1a; https://docs.mongoing.com/ 介绍…...

组合数求法汇总

一&#xff1a;递推求解 对于组合数&#xff0c;有此式&#xff1a; C n m C n − 1 m − 1 C n − 1 m C_{n}^{m}C_{n-1}^{m-1}C_{n-1}^{m} Cnm​Cn−1m−1​Cn−1m​。 C n m C_{n}^{m} Cnm​ 可理解为 n n n 个数中选 m m m 个&#xff0c;不同的方案。对于第 n n n 个…...

Python知识点:在Python编程中,如何使用Joblib进行并行计算

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; Joblib是一个Python库&#xff0c;它被设计用来提供轻便的并行计算解决方案&…...

matlab-对比两张图片的CIElab分量的差值并形成直方图

%对比两张图片的CIElab分量的差值并形成直方图&#xff0c;改个路径就能用&#xff0c;图片分辨率要一致 close all; clear all; clc; I1imread(E:\test\resources\image\1.jpg); I2imread(E:\test\resources\image\2.jpg); lab1 rgb2lab(I1); lab2 rgb2lab(I2); % 提取色度…...

(十七)、Mac 安装k8s

文章目录 1、Enable Kubernetes2、查看k8s运行状态3、启用 kubernetes-dashboard3.1、如果启动成功&#xff0c;可以在浏览器访问3.2、如果没有跳转&#xff0c;需要单独安装 kubernetes-dashboard3.2.1、方式一&#xff1a;一步到位3.2.2、方式二&#xff1a;逐步进行 1、Enab…...

信息学奥赛一本通 2087:【22CSPJ普及组】解密(decode) | 洛谷 P8814 [CSP-J 2022] 解密

【题目链接】 洛谷 P8814 [CSP-J 2022] 解密 ybt 2087&#xff1a;【22CSPJ普及组】解密(decode) 【题目考点】 1. 数学&#xff1a;一元二次方程求根 【解题思路】 输入n&#xff0c;d&#xff0c;e&#xff0c;满足 n p ∗ q np*q np∗q e ∗ d ( p − 1 ) ( q − 1…...

【重学 MySQL】四十八、DCL 中的 commit 和 rollback

【重学 MySQL】四十八、DCL 中的 commit 和 rollback commit的定义与作用rollback的定义与作用使用场景相关示例注意事项DDL 和 DML 的说明 在MySQL中&#xff0c;DCL&#xff08;Data Control Language&#xff0c;数据控制语言&#xff09;用于管理数据库用户和控制数据的访问…...

Java面试八股之认证授权

一、概念&#xff1a; 1、什么是认证&#xff1f;什么是授权&#xff1f; 认证 用于在系统登录时&#xff0c;验证身份的凭证&#xff0c;类似于账号、密码等。 授权 用户在访问资源时&#xff0c;根据权限的不同对资源访问程度不同。 2、什么是cookie&#xff1f;什么是…...

RCE_绕过综合

<aside> &#x1f4a1; 管道符 </aside> <aside> &#x1f4a1; 通配符绕过 </aside> **匹配任何字符串&#xff0f;文本&#xff0c;包括空字符串&#xff1b;*代表任意字符&#xff08;0个或多个&#xff09;? 匹配任何一个字符&#xff08;不…...

关于Generator,async 和 await的介绍

在本篇文章中我们主要围绕下面几个问题来介绍async 和await &#x1f370;Generator的作用&#xff0c;async 及 await 的特点&#xff0c;它们的优点和缺点分别是什么&#xff1f;await 原理是什么&#xff1f; &#x1f4c5;我的感受是我们先来了解Generator&#xff0c;在去…...

Redis数据库与GO(二):list,set

一、list&#xff08;列表&#xff09; list&#xff08;列表&#xff09;是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。List本质是个链表&#xff0c; list是一个双向链表&#xff0c;其元素是有序的&#xff0c;元…...

c++知识点总结

1.把字符串a复制到b里面 #include<iostream> #include<string.h> using namespace std; int main() {char a[110],b[110];cin>>a;int n strlen(a);for(int i 0;i<n1;i){b[i] a[i];}cout<<b;return 0; }2.比较两个字符串的大小 如果a大返回1&…...

无IDEA不Java:快速掌握Java集成开发环境

IntelliJ IDEA是一种强大的Java集成开发环境&#xff0c;是Java开发人员的首选工具之一。本文将介绍IDEA的基本使用方法和常用功能&#xff0c;以帮助初学者快速上手。 安装和配置 首先&#xff0c;需要下载并安装IntelliJ IDEA。在安装完成后&#xff0c;需要配置JDK&#xff…...

9.30学习记录(补)

手撕线程池: 1.进程:进程就是运行中的程序 2.线程的最大数量取决于CPU的核数 3.创建线程 thread t1; 在使用多线程时&#xff0c;由于线程是由上至下走的&#xff0c;所以主程序要等待线程全部执行完才能结束否则就会发生报错。通过thread.join()来实现 但是如果在一个比…...

移动应用中提升用户体验的因素

用户体验&#xff08;UX&#xff09;是任何移动应用程序成功的关键因素。随着数以百万计的应用程序争夺注意力&#xff0c;提供无缝、愉快和高效的体验可能是获得忠实用户或在一次互动后失去忠实用户之间的区别。无论是商业应用程序、游戏还是社交平台&#xff0c;增强用户体验…...

VS与VSCode的区别

文章目录 1. 什么是 Visual Studio 和 Visual Studio Code&#xff1f;Visual Studio&#xff08;VS&#xff09;Visual Studio Code&#xff08;VS Code&#xff09; 2. 主要区别详解性能和资源占用功能和复杂性扩展和自定义适用场景价格 3. 详细对比总结4. 如何选择适合自己的…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...