//Load Directory private List<ISO_8211_Directory> Load_Directory(ISO_8211_Leader leader, int fullPos) { List<ISO_8211_Directory> dirList = new List<ISO_8211_Directory>(); int directory_size = leader.bafa - leader.SIZE; char[] directoryBuff = new char[directory_size]; Array.Copy(fullData, leader.SIZE + fullPos, directoryBuff, 0, directory_size); int field_length_size = leader.sizeOfFieldLengthField - 48; char[] field_size_buff = new char[field_length_size]; int pos_size = leader.sizeOfFieldPositionField - 48; char[] pos_size_buff = new char[pos_size]; int pos = 0; while (directoryBuff[pos] != (int)DELIMITERS.UT) { ISO_8211_Directory directory = new ISO_8211_Directory(); Array.Copy(directoryBuff, pos, directory.Tag, 0, 4); // The size of field tag field is always 4 in S-57. S-101? pos += 4; //Console.Write("Directory Tag name = " + new string(directory.Tag)); Array.Copy(directoryBuff, pos, field_size_buff, 0, field_length_size); directory.Length = Utilities.charArray_to_int32(field_size_buff, field_size_buff.Length); pos += field_length_size; //Console.Write(" Directory field length = " + directory.Length); Array.Copy(directoryBuff, pos, pos_size_buff, 0, pos_size); directory.Position = Utilities.charArray_to_int32(pos_size_buff, pos_size_buff.Length); pos += pos_size; //Console.WriteLine(" Directory position = " + directory.Position); dirList.Add(directory); } return dirList; }
// Load Leader private ISO_8211_Leader Load_Leader(int fullPos) { ISO_8211_Leader leader = new ISO_8211_Leader(); char[] buffLeader = new char[leader.SIZE]; Array.Copy(fullData, fullPos, buffLeader, 0, leader.SIZE); leader.setValue(buffLeader); return leader; }
//Load DataDescriptions Record private Dictionary<string, ISO_8211_Record_DataDesc> Load_DataDescriptionRecord(ISO_8211_Leader leader, List<ISO_8211_Directory> dirList, int fullPos) { Dictionary<string, ISO_8211_Record_DataDesc> descList = new Dictionary<string, ISO_8211_Record_DataDesc>(); int descPos = leader.bafa+fullPos; ISO_8211_Directory entry; int sp = 0; int ep = 0; for (int i = 0; i < dirList.Count; i++) { entry = dirList[i]; sp = descPos; ep = descPos; ISO_8211_Record_DataDesc desc = new ISO_8211_Record_DataDesc(); //Field controls while (fullData[ep++] != (int)DELIMITERS.FCT) ; char[] fieldControlBuff = new char[ep - sp]; Array.Copy(fullData, sp, fieldControlBuff, 0, ep - sp); desc.field_control = fieldControlBuff; sp = ep; //Console.WriteLine("Field Controls : " + new string(fieldControlBuff)); //DataField name while (fullData[ep++] != (int)DELIMITERS.FT) ; char[] dataFieldNameBuff = new char[ep - sp]; Array.Copy(fullData, sp, dataFieldNameBuff, 0, ep - sp); desc.field_name = new string(dataFieldNameBuff); sp = ep; //Console.WriteLine("DataField name : " + new string(dataFieldNameBuff)); //Array descriptor while (fullData[ep++] != (int)DELIMITERS.UT) ; char[] arrayDescStrBuff = new char[ep - sp]; Array.Copy(fullData, sp, arrayDescStrBuff, 0, ep - sp); if (arrayDescStrBuff.Contains((char)DELIMITERS.FT)) { int arrayDescIndex = 0; while (arrayDescStrBuff[arrayDescIndex++] != (char)DELIMITERS.FT) ; char[] arrayDescBuff = new char[arrayDescIndex]; Array.Copy(arrayDescStrBuff, 0, arrayDescBuff, 0, arrayDescIndex); desc.array_desc_str = new string(arrayDescBuff); desc.array_descriptions = SplitArrayDescStr(desc.array_desc_str,leader.sizeOfFieldTagField-48); //Console.WriteLine("Array descriptor : " + desc.array_desc_str); int typeIndex = arrayDescIndex; while (arrayDescStrBuff[typeIndex++] != (char)DELIMITERS.UT) ; char[] fmfBuff = new char[typeIndex - arrayDescIndex]; Array.Copy(arrayDescStrBuff, arrayDescIndex, fmfBuff, 0, typeIndex - arrayDescIndex); desc.format_control_str = new string(fmfBuff); desc.format_controls = SplitFormatControlStr(desc.format_control_str); //Console.WriteLine("Format Control : " + desc.format_control_str); } else { desc.array_desc_str = new string(arrayDescStrBuff); desc.array_descriptions = SplitArrayDescStr(desc.array_desc_str, leader.sizeOfFieldTagField - 48); //Console.WriteLine("Array descriptor : " + desc.array_desc_str.ToString()); } descList.Add(new string(dirList[i].Tag),desc); descPos = descPos + entry.Length; //Console.WriteLine(); } return descList; }