You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1417 lines
59 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;
using System.Threading;
using System.Reflection.Emit;
using System.Collections.ObjectModel;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
using System.Diagnostics;
using System.IO.MemoryMappedFiles;
namespace Dat2Bin
{
public partial class Dat2BinForm : Form
{
int erro = 5;
int headSize = 2048;
float sps_pers = 1000.0f;//每秒采样点个数 1k 32k 16k
int chNum = 1;//通道数
int databits = 4;//24位 3字节
DateTime beginTime, endTime;
DateTime systemTime;
int sysCnt = 0;
string saveBinPath = "\\bin";
string saveDatPath = "\\splitdat";
int binHeadSize = 96;
//原始数据文件链表
public LinkList DataList = new LinkList();
Dictionary<int, int> pointStaNum = new Dictionary<int, int>();
bool useBackGround = false;
public BackgroundWorker bgwConvert;
public List<StationModel> StationList { get; set; }
public Dat2BinForm()
{
InitializeComponent();
systemTime = new DateTime(2023, 5, 1);
InitControl();
}
private void InitControl()
{
RegistryKey hklm = Registry.CurrentUser; //声明一个变量
RegistryKey hksw = hklm.OpenSubKey(@"SOFTWARE\Microsoft", true);
//string sk = "Software\\Microsoft\\ms";
RegistryKey hksm = hksw.OpenSubKey("ms", true);
//RegistryKey cn;
if (hksm == null)
{
hksw.CreateSubKey("ms");
hksm = hksw.OpenSubKey("ms", true);
hksm.SetValue("cnt", "0");
hksm.SetValue("cd", DateTime.Now.ToString());
}
sysCnt = int.Parse(hksm.GetValue("cnt").ToString());
hksm.SetValue("cnt", (sysCnt + 1).ToString());
systemTime = DateTime.Parse(hksm.GetValue("cd").ToString());
//Console.WriteLine(systemTime.ToString());
if (hklm != null)
{
hklm.Close();
}
if (hksw != null)
{
hksw.Close();
}
if (hksm != null)
{
hksm.Close();
}
}
private void buttonSelectData_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
//saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
ofd.Filter = "Dat数据*.dat |*.dat";
ofd.Title = "Open an Data File";
if (ofd.ShowDialog() == DialogResult.OK)
{
//只读取Z分量数据
//string[] fns = Directory.GetFiles(Path.GetDirectoryName(ofd.FileName), "*.dat");
//string[] fnsZ = fns.Where(fn => fn.Contains("ch01")).ToArray();
//savePath = Path.GetDirectoryName(ofd.FileName) + "\\bin";
//if (!Directory.Exists(savePath))
//{
// Directory.CreateDirectory(savePath);
//}
//OpenDataFile(fnsZ);
//listView1.Items.Clear();
//AddSourceDataFileToMyListView();
//读取所有数据
string[] fns = Directory.GetFiles(Path.GetDirectoryName(ofd.FileName), "*.dat");
//string[] fnsZ = fns.Where(fn => fn.Contains("ch01")).ToArray();
saveBinPath = Path.GetDirectoryName(ofd.FileName) + "\\bin";
if (!Directory.Exists(saveBinPath))
{
Directory.CreateDirectory(saveBinPath);
}
saveDatPath = Path.GetDirectoryName(ofd.FileName) + "\\splitdat";
if (!Directory.Exists(saveDatPath))
{
Directory.CreateDirectory(saveDatPath);
}
OpenDataFile(fns);
listView1.Items.Clear();
AddSourceDataFileToMyListView();
}
}
private void OpenDataFile(string[] FileNames)
{
//try
{
//清除原来的链表
DataList.Clear();
byte[] temp = new byte[headSize];
bool isExist = false;
for (int i = 0; i < FileNames.Length; i++)
{
string fn = Path.GetFileName(FileNames[i]);
string channel = Path.GetFileNameWithoutExtension(fn).Substring(5, 4);
/*如果文件名已经存在则不添加*/
for (int k = 1; k <= DataList.Length; k++)
{
if (DataList.GetnodeData(k).fileName == FileNames[i])
{
isExist = true;
}
}
if (isExist)
{
isExist = false;
continue;
}
//以文件的全路对应的字符串和文件打开模式来初始化FileStream文件流实例
FileStream OldDataFileStream = new FileStream(FileNames[i], FileMode.Open);
//以FileStream文件流来初始化BinaryReader文件阅读器
BinaryReader OldDataReadLineSReader = new BinaryReader(OldDataFileStream);
if (OldDataFileStream.Length <= headSize)
{
MessageBox.Show(fn + "数据文件大小不够");
}
else
{
OldDataReadLineSReader.Read(temp, 0, headSize);
// readLineSReader.Read()
HEADInfo OldDataFileHead = (HEADInfo)BytesToStuct(temp, typeof(HEADInfo));
OldDataFileHead.standby8 = channel;
if (OldDataFileHead.year < 2000)
{
OldDataFileHead.year += 2000;
}
DateTime fileStartTime = new DateTime(OldDataFileHead.year, OldDataFileHead.month, OldDataFileHead.day,
OldDataFileHead.hour, OldDataFileHead.minute, OldDataFileHead.sec);
//UTC时间TO北京时间
fileStartTime = fileStartTime.AddHours(8);//截取电流时候用
sps_pers = Convert.ToSingle(textBox_sps.Text);
//根据数据量计算和采样率计算采集时长
//文件头 2个通道 每个数据4个字节
long timesec = (OldDataFileStream.Length - headSize) / chNum / databits / (int)sps_pers;
DateTime fileEndTime = fileStartTime.AddSeconds(timesec);
// DateTime fileEndTime = fileStartTime.AddSeconds(timesec+1);//截取电流
DataList.Add(FileNames[i], fn, fileStartTime, fileEndTime, OldDataFileHead);
}
OldDataReadLineSReader.Close();
OldDataFileStream.Close();
}
}
//catch (Exception ex)
//{
// MessageBox.Show(ex.ToString());
//}
}
public void AddSourceDataFileToMyListView()
{
if (DataList.Length <= 0)
{
return;
}
try
{
ListViewItem[] boxitems = new ListViewItem[DataList.Length];
for (int i = 0; i < DataList.Length; i++)
{
SiteParameter OldDateFiledata = DataList.GetnodeData(i + 1);
boxitems[i] = new ListViewItem();
boxitems[i].Text = Convert.ToString(i + 1);
boxitems[i].SubItems.Add(OldDateFiledata.SafeFileName.ToString());
boxitems[i].SubItems.Add(OldDateFiledata.fileStartTime.ToString("yyyy-MM-dd H:mm:ss", new CultureInfo("zh-CHS")));
boxitems[i].SubItems.Add(OldDateFiledata.fileEndTime.ToString("yyyy-MM-dd H:mm:ss", new CultureInfo("zh-CHS")));
}
DateTime maxStartTime = DataList.GetnodeData(1).fileStartTime;
DateTime minEndTime = DataList.GetnodeData(1).fileEndTime;
for (int i = 1; i < DataList.Length; i++)
{
if (DataList.GetnodeData(i).fileStartTime > maxStartTime)
{
maxStartTime = DataList.GetnodeData(i).fileStartTime;
}
if (DataList.GetnodeData(i).fileEndTime < minEndTime)
{
minEndTime = DataList.GetnodeData(i).fileEndTime;
}
}
dtpBeginTime.Value = maxStartTime;
dtpEndTime.Value = minEndTime;
listView1.Items.AddRange(boxitems);
}
catch (System.Exception ex)
{
Console.WriteLine(ex);
}
}
private void MyListView1Clear()
{
//清除原来的链表
DataList.Clear();
listView1.Items.Clear();
}
public static byte[] StructToBytes(object structObj, int size)//对于TCP包需要直接指定大小
{
//得到结构体的大小
//int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}
public static object BytesToStuct(byte[] bytes, Type type)
{
//得到结构体的大小
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, type);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
}
private void Form1_Load(object sender, EventArgs e)
{
//int temp1 = 0x05;//0B00000101
//int temp2 = 0x09;//0B00001001
//int checkBit3 = 0x04;//0B0000100 提取第三位
//int checkBit8 = 0x08;//0B0000100 提取第四位
//int result3 = temp1 & checkBit3;
//int result4 = temp2 & checkBit8;
//Console.WriteLine(result3);
//Console.WriteLine(result4);
cbUseBackGround.Checked = useBackGround;
this.Text = "DatToBin_20201015";
SetMyListView1();
}
private void SetMyListView1()
{
//double v = 3.5;
//double m = v % 1;
//Console.WriteLine(m.ToString());
// Set the view to show details.
listView1.View = View.Details;
// Allow the user to edit item text.
listView1.LabelEdit = false;
// Allow the user to rearrange columns.
listView1.AllowColumnReorder = true;
// Display check boxes.
listView1.CheckBoxes = false;
// Select the item and subitems when selection is made.
listView1.FullRowSelect = true;
// Display grid lines.
listView1.GridLines = true;
int width = 200;
listView1.Columns.Add("编号", 50, HorizontalAlignment.Center);
listView1.Columns.Add("文件名称", 300, HorizontalAlignment.Center);
listView1.Columns.Add("开始采集时间", width, HorizontalAlignment.Center);
listView1.Columns.Add("结束采集时间", width, HorizontalAlignment.Center);
// listView1.Columns.Add("采样速率", 150, HorizontalAlignment.Center);
listView1.Visible = true;
listView1.Font = new System.Drawing.Font("Arial", 12);
}
private void buttonReadStaNum_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
ofd.Filter = "台站编号(*.txt |*.txt";
ofd.Title = "Open a Text File";
if (ofd.ShowDialog() == DialogResult.OK)
{
pointStaNum = new Dictionary<int, int>();
StreamReader sr = new StreamReader(ofd.FileName, Encoding.Default);
while (sr.Peek() >= 0)
{
string[] strs = sr.ReadLine().Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
pointStaNum.Add(int.Parse(strs[0]), int.Parse(strs[1]));
}
//listBox1.Items.AddRange(pointStaNum);
foreach (var item in pointStaNum)
{
listBox1.Items.Add(item.Key + "\t" + item.Value);
}
}
}
private void buttonConvertBin_Click(object sender, EventArgs e)
{
if (useBackGround)
{
bgwConvert = new BackgroundWorker();
bgwConvert.DoWork += BgwConvert_DoWork;
bgwConvert.ProgressChanged += BgwConvert_ProgressChanged;
bgwConvert.RunWorkerCompleted += BgwConvert_RunWorkerCompleted;
bgwConvert.WorkerReportsProgress = true;
bgwConvert.WorkerSupportsCancellation = true;
pgbarPrecent.Value = 0;
lblPrecent.Text = "0%";
bgwConvert.RunWorkerAsync();
}
else
{
DatToBinConvert(null, null);
}
}
private void BgwConvert_SplitDatRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("您取消了操作!");
//pgbarPrecent.Value = 0;
//lblPrecent.Text = "0%";
}
else if (e.Error != null)
{
MessageBox.Show("出现错误!");
}
else
{
MessageBox.Show("完成");
//pgbarPrecent.Value = 0;
//lblPrecent.Text = "0%";
}
}
private void BgwConvert_SplitDatProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbarPrecent.Value = e.ProgressPercentage;
lblPrecent.Text = (string)e.UserState + "%";
}
private void BgwConvert_SplitDat(object sender, DoWorkEventArgs e)
{
SplitDatConvertAsync(sender, e);
}
public async void SplitDatConvertAsync(object sender, DoWorkEventArgs e)
{
beginTime = dtpBeginTime.Value;
endTime = dtpEndTime.Value;
////单个文件时长
//int singleFileLength = int.Parse(textBoxSingleFileLength.Text) * 60;
// 截取时长
int splitLength = (int)(endTime - beginTime).TotalSeconds;
if (((DateTime.Now - systemTime).TotalDays < 30) &&
((DateTime.Now - systemTime).TotalDays >= 0) &&
sysCnt < 90)
{
List<SiteParameter> nodeList = new List<SiteParameter>();
//创建并启动计时器
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int dli = 0; dli < DataList.Length; dli++)
{
SiteParameter nodeData = this.DataList.GetnodeData(dli + 1);
nodeList.Add(nodeData);
//await ProcessFilesAsync(nodeData, beginTime, splitLength);
// WriteDatFile(nodeData, beginTime, splitLength);
//Task task=WriteDatFileTask(nodeData, beginTime, splitLength);
//task.Start();
//tasks.Add(task);
//WriteDatFileAsync(nodeData, beginTime, splitLength);
//task.Start();
}
await ProcessFilesAsync(nodeList, beginTime, splitLength);
stopwatch.Stop();
TimeSpan elapsedTime = stopwatch.Elapsed;
// 打印执行时间
Console.WriteLine($"异步分割时长: {elapsedTime.TotalMilliseconds}ms");
nodeList = null;
MessageBox.Show("转换完成");
}
else
{
MessageBox.Show("数据格式错误!");
}
}
public async Task WriteDatFileAsync(SiteParameter nodeData, DateTime startTime, int secs)
{
if (secs <= 0)
{
throw new ArgumentException("Parameter secs must be a positive integer.");
}
FileInfo fileInfo = new FileInfo(nodeData.fileName);
int count = secs * 4000;
if (fileInfo.Length >= (count + 2048))
{
DateTime dt = startTime.AddHours(-8);
string fileName = BuildNewFileName(nodeData, dt);
try
{
using (FileStream input = new FileStream(nodeData.fileName, FileMode.Open))
using (BinaryReader reader = new BinaryReader(input))
using (FileStream saveFileStream = new FileStream(saveDatPath + "\\" + fileName, FileMode.Create))
using (BinaryWriter writeLineSReader = new BinaryWriter(saveFileStream))
{
WriteFileHeader(writeLineSReader, nodeData, dt);
await WriteFileDataAsync(input, reader, writeLineSReader, startTime, nodeData, count);
}
}
catch (Exception ex)
{
// Log the exception or show an error message to the user.
Console.WriteLine($"Error: {ex.Message}");
}
}
}
private void WriteFileHeader(BinaryWriter writer, SiteParameter nodeData, DateTime dt)
{
nodeData.fileHead.year = (short)dt.Year;
nodeData.fileHead.month = (short)dt.Month;
nodeData.fileHead.day = (short)dt.Day;
nodeData.fileHead.hour = (short)(dt.Hour);
nodeData.fileHead.minute = (short)dt.Minute;
nodeData.fileHead.sec = (byte)dt.Second;
byte[] hs = StructToBytes(nodeData.fileHead, this.headSize);
writer.Write(hs);
}
private async Task WriteFileDataAsync(FileStream input, BinaryReader reader, BinaryWriter writer, DateTime startTime, SiteParameter nodeData, int count)
{
byte[] buffer = new byte[count];
int seekOff = (int)((startTime - nodeData.fileStartTime).TotalSeconds) * 4000;
input.Seek((long)this.headSize + seekOff, SeekOrigin.Begin);
reader.Read(buffer, 0, count);
await writer.BaseStream.WriteAsync(buffer, 0, count);
}
public async Task ProcessFilesAsync(List<SiteParameter> nodeDataList, DateTime startTime, int secs)
{
List<Task> tasks = new List<Task>();
foreach (SiteParameter nodeData in nodeDataList)
{
Task task = WriteDatFileAsync(nodeData, startTime, secs);
tasks.Add(task);
}
await Task.WhenAll(tasks);
}
public void WriteDatFile(SiteParameter nodeData, DateTime startTime, int secs)
{
if (secs <= 0)
{
throw new ArgumentException("Parameter secs must be a positive integer.");
}
FileInfo fileInfo = new FileInfo(nodeData.fileName);
int count = secs * 4000;
if (fileInfo.Length >= (count + 2048))
{
DateTime dt = startTime.AddHours(-8);
string fileName = BuildNewFileName(nodeData, dt);
try
{
using (FileStream input = new FileStream(nodeData.fileName, FileMode.Open))
using (BinaryReader reader = new BinaryReader(input))
using (FileStream saveFileStream = new FileStream(saveDatPath + "\\" + fileName, FileMode.Create))
using (BinaryWriter writeLineSReader = new BinaryWriter(saveFileStream))
{
WriteFileHeader(writeLineSReader, nodeData, dt);
WriteFileData(input, reader, writeLineSReader, startTime, nodeData, count);
}
}
catch (Exception ex)
{
// Log the exception or show an error message to the user.
Console.WriteLine($"Error: {ex.Message}");
}
}
}
private string BuildNewFileName(SiteParameter nodeData, DateTime dt)
{
return nodeData.SafeFileName.Substring(0, 10) + dt.Year.ToString("0000") + dt.Month.ToString("00") +
dt.Day.ToString("00") + "_" + dt.Hour.ToString("00") + dt.Minute.ToString("00") + dt.Second.ToString("00") + ".dat";
}
private void WriteFileData(FileStream input, BinaryReader reader, BinaryWriter writer, DateTime startTime, SiteParameter nodeData, int count)
{
byte[] buffer = new byte[count];
int seekOff = (int)((startTime - nodeData.fileStartTime).TotalSeconds) * 4000;
input.Seek((long)this.headSize + seekOff, SeekOrigin.Begin);
reader.Read(buffer, 0, count);
writer.Write(buffer);
}
public Task WriteDatFileTask(SiteParameter nodeData, DateTime startTime, int secs)
{
FileInfo fileInfo = new FileInfo(nodeData.fileName);
int count = secs * 4000;
Task task = null;
if (fileInfo.Length >= (count + 2048))
{
task = new Task(() =>
{
DateTime dt = startTime.AddHours(-8);
string fileName = nodeData.SafeFileName.Substring(0, 10) + dt.Year.ToString("0000") + dt.Month.ToString("00") +
dt.Day.ToString("00") + "_" + dt.Hour.ToString("00") + dt.Minute.ToString("00") + dt.Second.ToString("00") + ".dat";
FileStream input = new FileStream(nodeData.fileName, FileMode.Open);
BinaryReader reader = new BinaryReader(input);
FileStream SaveFileStream = new FileStream(saveDatPath + "\\" + fileName, FileMode.Create);
BinaryWriter WriteLineSReader = new BinaryWriter(SaveFileStream);
nodeData.fileHead.year = (short)dt.Year;
nodeData.fileHead.month = (short)dt.Month;
nodeData.fileHead.day = (short)dt.Day;
nodeData.fileHead.hour = (short)(dt.Hour);
nodeData.fileHead.minute = (short)dt.Minute;
nodeData.fileHead.sec = (byte)dt.Second;
byte[] hs = StructToBytes(nodeData.fileHead, this.headSize);
WriteLineSReader.Write(hs);
byte[] buffer = new byte[count];
int seekOff = (int)((startTime - nodeData.fileStartTime).TotalSeconds) * 4000;
input.Seek((long)this.headSize + seekOff, SeekOrigin.Begin);
reader.Read(buffer, 0, count);
WriteLineSReader.Write(buffer);
input.Close();
reader.Close();
SaveFileStream.Close();
WriteLineSReader.Close();
});
}
return task;
}
public void WriteDatFileTay(SiteParameter nodeData, DateTime startTime, int secs)
{
FileInfo fileInfo = new FileInfo(nodeData.fileName);
int count = secs * 4000;
if (fileInfo.Length >= (count + 2048))
{
DateTime dt = startTime.AddHours(-8);
string fileName = nodeData.SafeFileName.Substring(0, 10) + dt.Year.ToString("0000") + dt.Month.ToString("00") +
dt.Day.ToString("00") + "_" + dt.Hour.ToString("00") + dt.Minute.ToString("00") + dt.Second.ToString("00") + ".dat";
FileStream input = new FileStream(nodeData.fileName, FileMode.Open);
BinaryReader reader = new BinaryReader(input);
FileStream SaveFileStream = new FileStream(saveDatPath + "\\" + fileName, FileMode.Create);
BinaryWriter WriteLineSReader = new BinaryWriter(SaveFileStream);
nodeData.fileHead.year = (short)dt.Year;
nodeData.fileHead.month = (short)dt.Month;
nodeData.fileHead.day = (short)dt.Day;
nodeData.fileHead.hour = (short)(dt.Hour);
nodeData.fileHead.minute = (short)dt.Minute;
nodeData.fileHead.sec = (byte)dt.Second;
byte[] hs = StructToBytes(nodeData.fileHead, this.headSize);
WriteLineSReader.Write(hs);
byte[] buffer = new byte[count];
int seekOff = (int)((startTime - nodeData.fileStartTime).TotalSeconds) * 4000;
input.Seek((long)this.headSize + seekOff, SeekOrigin.Begin);
reader.Read(buffer, 0, count);
WriteLineSReader.Write(buffer);
input.Close();
reader.Close();
SaveFileStream.Close();
WriteLineSReader.Close();
}
}
public void WriteDatFileTestSpan(SiteParameter nodeData, DateTime startTime, int secs)
{
FileInfo fileInfo = new FileInfo(nodeData.fileName);
int count = secs * 4000;
if (fileInfo.Length >= (count + 2048))
{
DateTime dt = startTime.AddHours(-8);
string fileName = nodeData.SafeFileName.Substring(0, 10) + dt.Year.ToString("0000") + dt.Month.ToString("00") +
dt.Day.ToString("00") + "_" + dt.Hour.ToString("00") + dt.Minute.ToString("00") + dt.Second.ToString("00") + ".dat";
FileStream input = new FileStream(nodeData.fileName, FileMode.Open);
BinaryReader reader = new BinaryReader(input);
FileStream SaveFileStream = new FileStream(saveDatPath + "\\" + fileName, FileMode.Create);
BinaryWriter WriteLineSReader = new BinaryWriter(SaveFileStream);
nodeData.fileHead.year = (short)dt.Year;
nodeData.fileHead.month = (short)dt.Month;
nodeData.fileHead.day = (short)dt.Day;
nodeData.fileHead.hour = (short)(dt.Hour);
nodeData.fileHead.minute = (short)dt.Minute;
nodeData.fileHead.sec = (byte)dt.Second;
byte[] hs = StructToBytes(nodeData.fileHead, this.headSize);
//Stopwatch sw = Stopwatch.StartNew();
WriteLineSReader.Write(hs);
//sw.Stop();
//Console.WriteLine($"写入头的时长:{sw.ElapsedMilliseconds}");
/*sw.Start()*/;
byte[] buffer = new byte[count];
int seekOff = (int)((startTime - nodeData.fileStartTime).TotalSeconds) * 4000;
input.Seek((long)this.headSize + seekOff, SeekOrigin.Begin);
reader.Read(buffer, 0, count);
//sw.Stop();
//Console.WriteLine($"读取数据的时长:{sw.ElapsedMilliseconds}");
//sw.Start();
WriteLineSReader.Write(buffer);
//sw.Stop();
//Console.WriteLine($"运行时长:{sw.ElapsedMilliseconds}ms");
input.Close();
reader.Close();
SaveFileStream.Close();
WriteLineSReader.Close();
}
}
public async Task WriteDatFileAsyncIO(SiteParameter nodeData, DateTime startTime, int secs)
{
FileInfo fileInfo = new FileInfo(nodeData.fileName);
long count = secs * 4000L;
if (fileInfo.Length >= (count + 2048))
{
DateTime dt = startTime.AddHours(-8);
string fileName = nodeData.SafeFileName.Substring(0, 10) + dt.Year.ToString("0000") + dt.Month.ToString("00") +
dt.Day.ToString("00") + "_" + dt.Hour.ToString("00") + dt.Minute.ToString("00") + dt.Second.ToString("00") + ".dat";
using (FileStream inputFileStream = new FileStream(nodeData.fileName, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true))
{
using (FileStream SaveFileStream = new FileStream(saveDatPath + "\\" + fileName, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
{
// 写入文件头
nodeData.fileHead.year = (short)dt.Year;
nodeData.fileHead.month = (short)dt.Month;
nodeData.fileHead.day = (short)dt.Day;
nodeData.fileHead.hour = (short)(dt.Hour);
nodeData.fileHead.minute = (short)dt.Minute;
nodeData.fileHead.sec = (byte)dt.Second;
byte[] hs = StructToBytes(nodeData.fileHead, this.headSize);
await SaveFileStream.WriteAsync(hs, 0, hs.Length);
// 读取数据并写入新文件
int seekOff = (int)((startTime - nodeData.fileStartTime).TotalSeconds) * 4000;
long offset = this.headSize + seekOff * sizeof(float);
long bytesToRead = count * sizeof(float);
long totalBytesRead = 0;
int bufferSize = 1024 * 1024; // 1MB buffer
byte[] buffer = new byte[bufferSize];
while (bytesToRead > 0)
{
int bytesRead = (int)Math.Min(bufferSize, bytesToRead);
int numBytesRead = await inputFileStream.ReadAsync(buffer, 0, bytesRead);
if (numBytesRead == 0)
{
break;
}
totalBytesRead += numBytesRead;
bytesToRead -= numBytesRead;
await SaveFileStream.WriteAsync(buffer, 0, numBytesRead);
}
}
}
}
}
public void WriteDatFileAsync2(SiteParameter nodeData, DateTime startTime, int secs)
{
FileInfo fileInfo = new FileInfo(nodeData.fileName);
long count = secs * 4000L;
if (fileInfo.Length >= (count + 2048))
{
DateTime dt = startTime.AddHours(-8);
string fileName = nodeData.SafeFileName.Substring(0, 10) + dt.Year.ToString("0000") + dt.Month.ToString("00") +
dt.Day.ToString("00") + "_" + dt.Hour.ToString("00") + dt.Minute.ToString("00") + dt.Second.ToString("00") + ".dat";
using (var mmf = MemoryMappedFile.CreateFromFile(nodeData.fileName, FileMode.Open))
{
using (var accessor = mmf.CreateViewAccessor())
{
using (FileStream SaveFileStream = new FileStream(saveDatPath + "\\" + fileName, FileMode.Create))
{
using (BinaryWriter writer = new BinaryWriter(SaveFileStream))
{
// 写入文件头
nodeData.fileHead.year = (short)dt.Year;
nodeData.fileHead.month = (short)dt.Month;
nodeData.fileHead.day = (short)dt.Day;
nodeData.fileHead.hour = (short)(dt.Hour);
nodeData.fileHead.minute = (short)dt.Minute;
nodeData.fileHead.sec = (byte)dt.Second;
byte[] hs = StructToBytes(nodeData.fileHead, this.headSize);
writer.Write(hs);
// 读取数据并写入新文件
int seekOff = (int)((startTime - nodeData.fileStartTime).TotalSeconds) * 4000;
long offset = this.headSize + seekOff * sizeof(float);
long bytesToRead = count * sizeof(float);
long totalBytesRead = 0;
int bufferSize = 1024 * 1024; // 1MB buffer
byte[] buffer = new byte[bufferSize];
while (bytesToRead > 0)
{
int bytesRead = (int)Math.Min(bufferSize, bytesToRead);
accessor.ReadArray(offset + totalBytesRead, buffer, 0, bytesRead);
totalBytesRead += bytesRead;
bytesToRead -= bytesRead;
writer.Write(buffer, 0, bytesRead);
}
}
}
}
}
}
}
private void BgwConvert_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("您取消了操作!");
//pgbarPrecent.Value = 0;
//lblPrecent.Text = "0%";
}
else if (e.Error != null)
{
MessageBox.Show("出现错误!");
}
else
{
MessageBox.Show("完成");
//pgbarPrecent.Value = 0;
//lblPrecent.Text = "0%";
}
}
private void BgwConvert_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbarPrecent.Value = e.ProgressPercentage;
lblPrecent.Text = (string)e.UserState + "%";
}
private void BgwConvert_DoWork(object sender, DoWorkEventArgs e)
{
DatToBinConvert(sender, e);
MessageBox.Show("转换完成");
}
public void DatToBinConvert(object sender, DoWorkEventArgs e)
{
beginTime = dtpBeginTime.Value;
endTime = dtpEndTime.Value;
DateTime CurTime;
//读取数据时长
int totalSec = 0;
//当前时差
int timeDiff = 0;
//单个文件时长
int singleFileLength = int.Parse(textBoxSingleFileLength.Text) * 60;
for (int dli = 0; dli < DataList.Length; dli++)
{
SiteParameter nodeData = this.DataList.GetnodeData(dli + 1);
CurTime = beginTime;
while (nodeData.fileEndTime >= CurTime && CurTime >= nodeData.fileStartTime)
{
if (CurTime > endTime)
{
break;
}
else
{
//计算文件结束时间与当前时间的时差
timeDiff = (int)(endTime - CurTime).TotalSeconds;
//如果当前时差小于单个文件时长,当前时间增加当前时差,否则当前时间增加单个文件时长
if (timeDiff <= 0)
{
break;
}
else if (timeDiff < singleFileLength)
{
totalSec = timeDiff;
}
else
{
totalSec = singleFileLength;
}
//读取Dat数据生成Bin文件
WriteBinData(nodeData, CurTime, totalSec);
}
if (useBackGround)
{
float precent = (dli + 1f) / ((float)DataList.Length) * 100f;
bgwConvert.ReportProgress((int)precent, Math.Round(precent, 2).ToString());
}
CurTime = CurTime.AddSeconds(totalSec);
}
}
}
private void cbUseBackGround_CheckedChanged(object sender, EventArgs e)
{
useBackGround = cbUseBackGround.Checked;
}
public void ReadByte(string fn)
{
FileStream input = new FileStream(fn, FileMode.Open);
BinaryReader reader = new BinaryReader(input);
input.Seek((long)this.headSize, SeekOrigin.Begin);
byte[] buffer = new byte[4];
reader.Read(buffer, 0, 4);
int intData = BitConverter.ToInt32(buffer, 0);
//byte[] b2 = Int32ToBytes(intData);
float f = (float)(intData * 0.000000000011641532f);
byte[] b2 = FloatToBytes(f, false);
Console.WriteLine("[0]:{0}\t[1]:{1}\t[2]:{2}\t[3]:{3}", b2[0], b2[1], b2[2], b2[3]);
//Console.WriteLine("[0]:{0}\t[1]:{1}\t[2]:{2}\t[3]:{3}\tint:{4}\tfloat:{5}", buffer[0], buffer[1], buffer[2], buffer[3],intData, f);
input.Close();
reader.Close();
}
public void WriteBinData(SiteParameter nodeData, DateTime curTime, int totalSeconds)
{
HEADInfo info = (HEADInfo)BytesToStuct(StructToBytes(nodeData.fileHead, this.headSize), typeof(HEADInfo));
int staNum = int.Parse(info.Nst.ToString().Substring(2, 2));
int pointNum = staNum;
if (pointStaNum.Count > 0)
{
var psnw = pointStaNum.Where(psn => psn.Value == staNum);
if (psnw == null)
{
return;
}
if (psnw.Count() == 0)
{
return;
}
//var psnr = psnw.First();
//if (psnr.)
//{
// return;
//}
pointNum = psnw.First().Key;
}
string fileName = "N" + String.Format("{0:d3}", pointNum) + "_" +
curTime.Year.ToString("0000") + "-" + curTime.Month.ToString("00") + "-" + curTime.Day.ToString("00") +
"~" + curTime.Hour.ToString("00") + "_" + String.Format("{0:d3}", 1) + ".bin";
FileStream input = new FileStream(nodeData.fileName, FileMode.Open);
BinaryReader reader = new BinaryReader(input);
FileStream SaveFileStream = new FileStream(saveBinPath + "\\" + fileName, FileMode.Create);
BinaryWriter WriteLineSReader = new BinaryWriter(SaveFileStream);
int count = (this.chNum * this.databits) * ((int)this.sps_pers);
byte[] buffer = new byte[count];
char[] chars = new char[this.binHeadSize];
byte[] buffer3 = new byte[count];
int seekOff = (int)((curTime - nodeData.fileStartTime).TotalSeconds) * 4000;
input.Seek((long)this.headSize + seekOff, SeekOrigin.Begin);
for (int j = 0; j < totalSeconds; j++)
{
reader.Read(buffer, 0, count);
for (int k = 0; k < count; k += 4)
{
//buffer3[k] = buffer[k + 3];
//buffer3[k + 1] = buffer[k + 2];
//buffer3[k + 2] = buffer[k + 1];
//buffer3[k + 3] = buffer[k ];
//if (buffer[k + 3] == 0)
//{
// buffer3[k + 1] = 0xFF;
//}
//else
//{
// buffer3[k + 1] = buffer[k + 3];
//}
//buffer3[k + 2] = buffer[k + 2];
//buffer3[k + 3] = buffer[k + 1];
//buffer3[k] = buffer[k];
buffer3[k] = 0xFF;
if (buffer[k + 3] == 0)
{
buffer3[k + 1] = 0xFF;
}
else
{
buffer3[k + 1] = buffer[k + 3];
}
buffer3[k + 2] = buffer[k + 2];
buffer3[k + 3] = buffer[k + 1];
}
DateTime time = curTime.AddSeconds((double)j);
string[] strArray4 = new string[] { "$GPRMC,", time.Hour.ToString("00"),
time.Minute.ToString("00"), time.Second.ToString("00"), ".00,A,",
info.channel[0].Y.ToString("0000.00000"), ",N,",
info.channel[0].X.ToString("00000.00000"),
",E,0.002,,", time.Day.ToString("00"), time.Month.ToString("00"),
(time.Year - 0x7d0).ToString("00"), ",,,A*7\r\n" };
string str6 = string.Concat(strArray4);
string[] strArray5 = new string[0x10];
strArray5[0] = "$$175B";
strArray5[1] = time.Year.ToString("0000");
strArray5[2] = "-";
strArray5[3] = time.Month.ToString("00");
strArray5[4] = "-";
strArray5[5] = time.Day.ToString("00");
strArray5[6] = " ";
strArray5[7] = time.Hour.ToString("00");
strArray5[8] = ":";
strArray5[9] = time.Minute.ToString("00");
strArray5[10] = ":";
strArray5[11] = time.Second.ToString("00");
strArray5[12] = " ";
strArray5[13] = (pointNum).ToString("00");
strArray5[14] = " ";
strArray5[15] = str6;
chars = string.Concat(strArray5).ToCharArray();
WriteLineSReader.Write(chars);
WriteLineSReader.Write(buffer3);
}
input.Close();
reader.Close();
SaveFileStream.Close();
WriteLineSReader.Close();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
ofd.Filter = "Dat数据*.dat |*.dat";
ofd.Title = "Open an Data File";
if (ofd.ShowDialog() == DialogResult.OK)
{
ReadByte(ofd.FileName);
}
}
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
ofd.Filter = "Dat数据*.bin |*.bin";
ofd.Title = "Open an Data File";
if (ofd.ShowDialog() == DialogResult.OK)
{
FileStream input = new FileStream(ofd.FileName, FileMode.Open);
BinaryReader reader = new BinaryReader(input);
input.Seek(96, SeekOrigin.Begin);
byte[] buffer = new byte[4];
reader.Read(buffer, 0, 4);
int intData = ByteToInt32(buffer);
//string utmp = String.Join("", (BitConverter.ToString(buffer, 0)).Split('-'));
//Int64 intData = (GetBaseNum(utmp));
float ff = -5.516708f;
int dd = (int)(ff / 0.0000000000582f);
byte[] b2 = Int32ToBytes(dd);
float fd = (float)(intData * 2.5f / 4294967296f);
//Console.WriteLine("byte:{0}\tint:{1}\tint:{2}", buffer, intData,fd);
Console.WriteLine("[0]:{0}\t[1]:{1}\t[2]:{2}\t[3]:{3}", b2[0], b2[1], b2[2], b2[3]);
//Console.WriteLine("[0]:{0}\t[1]:{1}\t[2]:{2}\t[3]:{3}\tint:{4}\tfloat:{5}", buffer[0], buffer[1], buffer[2], buffer[3], intData, fd);
input.Close();
reader.Close();
}
}
public float BytesToFloat(byte[] tempbyte, bool isBigEnd)
{
float tempInput = 0f;
char[] tempchar = new char[8];
MemoryStream membuff = new MemoryStream(4);
BinaryWriter bin2mem = new BinaryWriter(membuff);
byte[] tb = new byte[4];
BinaryReader mem2float = new BinaryReader(membuff);
if (isBigEnd)
{
tb[3] = tempbyte[0];
tb[2] = tempbyte[1];
tb[1] = tempbyte[2];
tb[0] = tempbyte[3];
}
else
{
tb = tempbyte;
}
bin2mem.Write(tb, 0, 4);
membuff.Position = 0;
tempInput = mem2float.ReadSingle();
return tempInput;
}
public byte[] FloatToBytes(float value, bool isBigEnd)
{
byte[] tempbyte = new byte[4];
byte[] rtnBytes = new byte[4];
MemoryStream membuff = new MemoryStream(4);
BinaryWriter bin2mem = new BinaryWriter(membuff);
membuff.Position = 0;
bin2mem.Write(value);
tempbyte = membuff.ToArray();
if (isBigEnd)
{
for (int i = 0; i < tempbyte.Length; i++)
{
rtnBytes[i] = tempbyte[3 - i];
}
}
else
{
rtnBytes = tempbyte;
}
return rtnBytes;
}
private int ByteToInt32(Byte[] arrByte)
{
//按两个字节一个整数解析,前一字节当做整数低位,后一字节当做整数高位,调用系统函数转化
Byte[] tmpBytes = new Byte[4] { arrByte[3], arrByte[2], arrByte[1], arrByte[0] };
return BitConverter.ToInt32(tmpBytes, 0);
}
public byte[] Int32ToBytes(int indata)
{
byte[] destByteArr = new byte[4];
destByteArr[0] = Convert.ToByte((indata & 0x000000FF));
destByteArr[1] = Convert.ToByte((indata & 0x0000FF00) >> 8);
destByteArr[2] = Convert.ToByte((indata & 0x00FF0000) >> 16);
destByteArr[3] = Convert.ToByte((indata & 0xFF000000) >> 24);
return destByteArr;
}
int GetBaseNum(String sComplement)
{
Int64 iTmp = Convert.ToInt32(sComplement, 16);
if (iTmp >= 0x80000000)
{
iTmp = ~(iTmp - 1);
//MessageBox.Show("1");
//iTmp = 0x1000000000 - iTmp;
}
return (int)iTmp;
}
//byte数组变为 float数值
private static float ToFloat(byte[] data)
{
//undefined
unsafe
{
//undefined
float a = 0.0F;
byte i;
byte[] x = data;
void* pf;
fixed (byte* px = x)
{
//undefined
pf = &a;
for (i = 0; i < data.Length; i++)
{
//undefined
*((byte*)pf + i) = *(px + i);
}
}
return a;
}
}
private void btnReadDatSingle_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
//saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
ofd.Filter = "Dat数据*.dat |*.dat";
ofd.Title = "Open an Data File";
if (ofd.ShowDialog() == DialogResult.OK)
{
string[] fns = Directory.GetFiles(Path.GetDirectoryName(ofd.FileName), "*.dat");
string[] fnsZ = fns.Where(fn => fn.Contains("ch01")).ToArray();
saveBinPath = Path.GetDirectoryName(ofd.FileName) + "\\bin";
if (!Directory.Exists(saveBinPath))
{
Directory.CreateDirectory(saveBinPath);
}
OpenDataFile(fnsZ);
listView1.Items.Clear();
AddSourceDataFileToMyListView();
}
}
private void button3_Click(object sender, EventArgs e)
{
string str = textBox1.Text;
int si = GetBaseNum(str);
Console.WriteLine(si);
double dv = si * 5.82E-10;
textBoxFloat.Text = dv.ToString();
int li = (int)(dv / 5.82E-10);
Console.WriteLine(li);
byte[] bs = BitConverter.GetBytes(li);
string strx2 = "";
foreach (var item in bs)
{
strx2 += item.ToString("X2");
Console.WriteLine(item.ToString("X2"));
}
textBoxConByFloat.Text = strx2;
////string[] strs = str.Split(new char[] { ' '});
//byte[] bytes = Convert.FromBase64String(str);
////byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(str);
////string str2= BitConverter.ToString(byteArray);
//string str2 = Convert.ToBase64String(bytes);
////int intData = BitConverter.ToInt32(bytes, 0);
////byte[] b2 = Int32ToBytes(intData);
//// float f = (float)(intData * 0.000000000011641532f);
//float ff = BytesToFloat(bytes, cbBigEnd.Checked);
//textBoxFloat.Text = ff.ToString();
//Console.WriteLine(ff.ToString());
////Console.WriteLine(str2);
////foreach (var item in byteArray)
////{
//// Console.WriteLine(item);
////}
}
private void button4_Click(object sender, EventArgs e)
{
byte[] bs = FloatToBytes(float.Parse(textBoxFloat.Text), cbBigEnd.Checked);
string str = "";
for (int i = 0; i < bs.Length; i++)
{
str += bs[i].ToString("X2");
}
textBoxConByFloat.Text = str;
}
private void buttonReadStaNum2_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
ofd.Filter = "台站编号(*.spj |*.spj";
ofd.Title = "Open a Text File";
if (ofd.ShowDialog() == DialogResult.OK)
{
pointStaNum = new Dictionary<int, int>();
string[] rows = File.OpenText(ofd.FileName).ReadToEnd().Trim().Split('\n');
File.OpenText(ofd.FileName).Close();
int rowNum = 0;
while (rowNum < rows.Length)
{
//台站信息
if (rows[rowNum].Contains("[台站信息]"))
{
int subNum = rowNum + 2;
while (!rows[subNum].Contains("[井信息]"))
{
string[] cols = rows[subNum].Split('\t');
pointStaNum.Add(int.Parse(cols[0]), int.Parse(cols[1]));
subNum++;
}
rowNum = subNum;
continue;
}
rowNum++;
}
//listBox1.Items.AddRange(pointStaNum);
listBox1.Items.Clear();
foreach (var item in pointStaNum)
{
listBox1.Items.Add(item.Key + "\t" + item.Value);
}
}
}
private void buttonSplitDat_Click(object sender, EventArgs e)
{
SplitDatConvert(null,null);
}
public void SplitDatConvert(object sender, DoWorkEventArgs e)
{
beginTime = dtpBeginTime.Value;
endTime = dtpEndTime.Value;
////单个文件时长
//int singleFileLength = int.Parse(textBoxSingleFileLength.Text) * 60;
// 截取时长
int splitLength = (int)(endTime - beginTime).TotalSeconds;
if (((DateTime.Now - systemTime).TotalDays < 30) &&
((DateTime.Now - systemTime).TotalDays >= 0) &&
sysCnt < 90)
{
List<SiteParameter> nodeList = new List<SiteParameter>();
//创建并启动计时器
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int dli = 0; dli < DataList.Length; dli++)
{
SiteParameter nodeData = this.DataList.GetnodeData(dli + 1);
nodeList.Add(nodeData);
//await ProcessFilesAsync(nodeData, beginTime, splitLength);
WriteDatFile(nodeData, beginTime, splitLength);
//Task task=WriteDatFileTask(nodeData, beginTime, splitLength);
//task.Start();
//tasks.Add(task);
//WriteDatFileAsync(nodeData, beginTime, splitLength);
//task.Start();
}
// await ProcessFilesAsync(nodeList, beginTime, splitLength);
stopwatch.Stop();
TimeSpan elapsedTime = stopwatch.Elapsed;
// 打印执行时间
Console.WriteLine($"同步分割时长: {elapsedTime.TotalMilliseconds}ms");
MessageBox.Show("转换完成");
}
else
{
MessageBox.Show("数据格式错误!");
}
}
private void buttonSplitAsync_Click(object sender, EventArgs e)
{
if (useBackGround)
{
bgwConvert = new BackgroundWorker();
bgwConvert.DoWork += BgwConvert_SplitDat;
bgwConvert.ProgressChanged += BgwConvert_SplitDatProgressChanged;
bgwConvert.RunWorkerCompleted += BgwConvert_SplitDatRunWorkerCompleted; ;
bgwConvert.WorkerReportsProgress = true;
bgwConvert.WorkerSupportsCancellation = true;
pgbarPrecent.Value = 0;
lblPrecent.Text = "0%";
bgwConvert.RunWorkerAsync();
}
else
{
SplitDatConvertAsync(null, null);
}
}
public void WriteBinDataBak20201212(SiteParameter nodeData, DateTime curTime, int totalSeconds)
{
HEADInfo info = (HEADInfo)BytesToStuct(StructToBytes(nodeData.fileHead, this.headSize), typeof(HEADInfo));
int staNum = int.Parse(info.Nst.ToString().Substring(2, 2));
int pointNum = staNum;
if (pointStaNum.Count > 0)
{
pointNum = (pointStaNum.First(psn => psn.Value == staNum).Key);
}
string fileName = "N" + String.Format("{0:d3}", pointNum) + "_" +
curTime.Year.ToString("0000") + "-" + curTime.Month.ToString("00") + "-" + curTime.Day.ToString("00") +
"~" + curTime.Hour.ToString("00") + "_" + String.Format("{0:d3}", 1) + ".bin";
FileStream input = new FileStream(nodeData.fileName, FileMode.Open);
BinaryReader reader = new BinaryReader(input);
FileStream SaveFileStream = new FileStream(saveBinPath + "\\" + fileName, FileMode.Create);
BinaryWriter WriteLineSReader = new BinaryWriter(SaveFileStream);
int count = (this.chNum * this.databits) * ((int)this.sps_pers);
byte[] buffer = new byte[count];
char[] chars = new char[this.binHeadSize];
byte[] buffer3 = new byte[count];
int seekOff = (int)((curTime - nodeData.fileStartTime).TotalSeconds) * 4000;
input.Seek((long)this.headSize + seekOff, SeekOrigin.Begin);
for (int j = 0; j < totalSeconds; j++)
{
reader.Read(buffer, 0, count);
for (int k = 0; k < count; k += 4)
{
//buffer3[k] = buffer[k];
buffer3[k] = 0xFF;
if (buffer[k + 3] == 0)
{
buffer3[k + 1] = 0xFF;
}
else
{
buffer3[k + 1] = buffer[k + 3];
}
buffer3[k + 2] = buffer[k + 2];
buffer3[k + 3] = buffer[k + 1];
}
DateTime time = curTime.AddSeconds((double)j);
string[] strArray4 = new string[] { "$GPRMC,", time.Hour.ToString("00"),
time.Minute.ToString("00"), time.Second.ToString("00"), ".00,A,",
info.channel[0].Y.ToString("0000.00000"), ",N,",
info.channel[0].X.ToString("00000.00000"),
",E,0.002,,", time.Day.ToString("00"), time.Month.ToString("00"),
(time.Year - 0x7d0).ToString("00"), ",,,A*7\r\n" };
string str6 = string.Concat(strArray4);
string[] strArray5 = new string[0x10];
strArray5[0] = "$$175B";
strArray5[1] = time.Year.ToString("0000");
strArray5[2] = "-";
strArray5[3] = time.Month.ToString("00");
strArray5[4] = "-";
strArray5[5] = time.Day.ToString("00");
strArray5[6] = " ";
strArray5[7] = time.Hour.ToString("00");
strArray5[8] = ":";
strArray5[9] = time.Minute.ToString("00");
strArray5[10] = ":";
strArray5[11] = time.Second.ToString("00");
strArray5[12] = " ";
strArray5[13] = (pointNum).ToString("00");
strArray5[14] = " ";
strArray5[15] = str6;
chars = string.Concat(strArray5).ToCharArray();
WriteLineSReader.Write(chars);
WriteLineSReader.Write(buffer3);
}
input.Close();
reader.Close();
SaveFileStream.Close();
WriteLineSReader.Close();
}
}
public class StationModel
{
public string Name { get; set; }
public int ID { get; set; }
public double X { get; set; }
public double Y { get; set; }
/// <summary>
/// 海拔
/// </summary>
public double Z { get; set; }
public double Size { get; set; }
public Color Color { get; set; } = Color.Red;
}
}