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#

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;
}
}