swmm out结果二进制解析(C#)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

public partial class Form1 : Form
{
//[DllImport("swmmh5.dll", EntryPoint = "swmm_open")]
//private static extern int swmm_open(string inpFile, string rptFile, string outFile);
//[DllImport("swmmh5.dll", EntryPoint = "swmm_start")]
//private static extern int swmm_start(int num);
//[DllImport("swmmh5.dll", EntryPoint = "GetSwmmResult")]
//private static extern int GetSwmmResult(int iType, int iIndex, int vIndex, int period, float value);
//[DllImport("swmmh5.dll", EntryPoint = "CloseSwmmOutFile")]
//private static extern void CloseSwmmOutFile();
//读取思路:
//1)判断out文件是否为完整结构,判断原则:magic1的值和magic2的值不等,或者错误码不为0,或者时间点总数为0
//2)读取各要素的IDnames(idname的个数、idname的字符)
//3)读取各要素输入的部分属性变量,subcatchment:area,node:node type code、node invert elevation 、node max.depth,link:link type code、upstream invert offset、downstream invert offset、link max. depth、(link length
//4)读取计算的结果值,每个步长为一个片段,片段由两部分组成:报告输出的时间(年月日时分秒),各要素各属性的值
const int RECORDSIZE = 4;
int version;
int NflowUnits;
int Nsubcatch;
int Nnodes;
int Nlinks;
int Npolluts;

public Form1()
{
InitializeComponent();
}
//读取out文件结果
private int OpenSwmmOutFile(string file)
{
int magic1, magic2, version;
int err;
int startPos;//数据开始位置
int nPeriods;//报告阶段总数(时间点总数)
int errCode;//错误码
int IDpos;//id开始的位置
int propertyPos;//属性开始的位置
string pollutantUnit;//污染物单位

//定义各要素id数组
int[] subcatchmentIDArray;
int[] nodeIDArray;
int[] linkIDArray;
int[] pollutantIDArray;


//打开output文件,小于14个字节,返回常数
BinaryReader br = new BinaryReader(new FileStream(file, FileMode.Open));
if (br == null || br.BaseStream.Length < RECORDSIZE * 14)
{
br.Close();
err = 1;
}
//从文件末尾读取参数,依次为:数据开始位置、时间点总数、错误码、magic2
br.BaseStream.Seek(-RECORDSIZE * 6, SeekOrigin.End);
IDpos = br.ReadInt32();
propertyPos = br.ReadInt32();
startPos = br.ReadInt32();
nPeriods = br.ReadInt32();
errCode = br.ReadInt32();
magic2 = br.ReadInt32();
//开始的4个字节为magic1的值

br.BaseStream.Seek(0, SeekOrigin.Begin);
magic1 = br.ReadInt32();
//如果magic1的值和magic2的值不等,或者错误码不为0,或者时间点总数为0,则关闭退出。
if (magic1 != magic2 || errCode != 0 || nPeriods == 0)
{
err = 1;
}
else
{
err = 0;
}
if (err == 1)
{
br.Close();
return err;
}
//接下来读取额外的参数,依次为:版本号、单位、汇水区总数、节点总数、管线总数、污染物总数
version = br.ReadInt32();
NflowUnits = br.ReadInt32();
Nsubcatch = br.ReadInt32();
Nnodes = br.ReadInt32();
Nlinks = br.ReadInt32();
Npolluts = br.ReadInt32();

//**********-----------读取ID列表,id开始的位置为idPos------------**********
//IDnames由两部分组成:1)该ID所包含的字符数量,以4字节存储,2)组成该ID的每一个字符,以1字节存储
br.BaseStream.Seek(IDpos, SeekOrigin.Begin);
subcatchmentIDArray = new int[Nsubcatch];
nodeIDArray = new int[Nnodes];
linkIDArray = new int[Nlinks];
pollutantIDArray = new int[Npolluts];
for (int i = 0; i < Nsubcatch; i++)
{
//读取subcatchmentIDNames包含多少个字符
int numSubIdNames = br.ReadInt32();
//subcatchmentIDArray[i] = br.ReadInt32();
//读取组成ID的name字符串,NumSubIdNames个char

byte[] subcatchByte = new byte[numSubIdNames];
for (int count = 0; count < numSubIdNames; count++)
{
subcatchByte[count] = br.ReadByte();
}
string subcatchName = System.Text.Encoding.Default.GetString(subcatchByte);
txtSubcatchID.Text += subcatchName + "\r\n";

}
for (int i = 0; i < Nnodes; i++)
{
int numNodeIdNames = br.ReadInt32();
byte[] nodeByte = new byte[numNodeIdNames];
for (int count = 0; count < numNodeIdNames; count++)
{
nodeByte[count] = br.ReadByte();
}
string nodeName = System.Text.Encoding.Default.GetString(nodeByte);
//txtSubcatchID.Text += nodeName + "\r\n";
}
for (int i = 0; i < Nlinks; i++)
{
int numLinkIdNames = br.ReadInt32();
byte[] linkByte=new byte[numLinkIdNames];
for(int count=0;count{
linkByte[count]=br.ReadByte();
}
string linkName = Sys

tem.Text.Encoding.Default.GetString(linkByte);
//txtSubcatchID.Text += linkName + "\r\n";
}
for (int i = 0; i < Npolluts; i++)
{
int numPollutsNames = br.ReadInt32();
byte[] pollutsByte = new byte[numPollutsNames];
for (int count = 0; count < numPollutsNames; count++)
{
pollutsByte[count] = br.ReadByte();
}
//string pollutsName = System.Text.Encoding.Default.GetString(pollutsByte);
}
//再往下读的内容为污染物单位
switch (br.ReadInt32())
{
case 0:
pollutantUnit = "mg/L";
break;
case 1:
pollutantUnit = "ug/L";
break;
case 2:
pollutantUnit = "counts/L";
break;
}

///**********------------读取各要素property-----------**********
br.BaseStream.Seek(propertyPos, SeekOrigin.Begin);
//获取subcatch属性的个数
int numSubcatProperty = br.ReadInt32();
//获取node属性的个数
int offsetTemp1 = numSubcatProperty * Nsubcatch;
br.BaseStream.Seek((offsetTemp1 + 1) * 4, SeekOrigin.Current);
int numNodeProperty = br.ReadInt32();
//获取link属性的个数
int offsetTemp2 = numNodeProperty * Nnodes;
br.BaseStream.Seek((offsetTemp2 + 3) * 4, SeekOrigin.Current);
int numLinkProperty = br.ReadInt32();


List subcatchProNameList = new List();
List subcatchProValueList = new List();

List nodeProNameList = new List();
List nodeProValueList = new List();

List linkProNameList = new List();
List linkProValueList = new List();

//获取subcatch属性
br.BaseStream.Seek(propertyPos + 4, SeekOrigin.Begin);
subcatchProNameList.Add(br.ReadInt32());
for (int i = 0; i < Nsubcatch * 1; i++)
{
subcatchProValueList.Add(br.ReadSingle());
txtSubcatchPro.Text += subcatchProValueList[i].ToString() + "\r\n";
}
//获取node属性
br.ReadInt32();
nodeProNameList.Add(br.ReadInt32());
nodeProNameList.Add(br.ReadInt32());
nodeProNameList.Add(br.ReadInt32());
for (int i = 0; i < Nnodes * 3; i++)
{
nodeProValueList.Add(br.ReadSingle());
}
//获取link属性
br.ReadInt32();
linkProNameList.Add(br.ReadInt32());
linkProNameList.Add(br.ReadInt32());
linkProName

List.Add(br.ReadInt32());
linkProNameList.Add(br.ReadInt32());
linkProNameList.Add(br.ReadInt32());
for (int i = 0; i < Nlinks * 5; i++)
{
linkProValueList.Add(br.ReadSingle());
}
///**********-----------获取计算结果------------**********
br.BaseStream.Seek(startPos, SeekOrigin.Begin);
List reportInterval = new List();//定义存储报告时间间隔的变量
List subcatchResultValueList = new List();
List nodeResultValueList = new List();
List linkResultValueList = new List();
List systemResultValueList = new List();

//获取报告时间间隔
for (int i = 0; i < nPeriods; i++)
{
double timeTemp = br.ReadDouble();
DateTime dt = DateTime.FromOADate(timeTemp);
reportInterval.Add(dt);
txtSubcatchReVal.Text += reportInterval[i] + "\r\n";

//获取subcatchment变量
for (int su = 1; su <= Nsubcatch * (8 + Npolluts) ; su++)
{
subcatchResultValueList.Add(br.ReadSingle());
txtSubcatchReVal.Text += subcatchResultValueList[su-1+i*Nsubcatch*(8+Npolluts)].ToString()+" ";
if (su % 8 == 0 && su != 0)
{
txtSubcatchReVal.Text += "\r\n";
}
}
//获取node变量
for (int no = 0; no < Nnodes * (6 + Npolluts); no++)
{
nodeResultValueList.Add(br.ReadSingle());
}
//获取link变量
for (int li = 0; li < Nlinks * (5 + Npolluts); li++)
{
linkResultValueList.Add(br.ReadSingle());
}
//获取system变量
for (int sy = 0; sy < 15; sy++)
{
systemResultValueList.Add(br.ReadSingle());
}
}
br.Close();
return err;
}

相关文档
最新文档