private int subRecordBinding(ISO_8211_Record_DataDesc.FormatControl fc, byte[] unitBuff, int fieldPos,ISO_8211_Record_SubField subRecord) { int length = fc.length; byte[] buff; switch (fc.type) { case ISO_8211_Record_DataDesc.FORMAT_CONTROL.A: StringBuilder sb = new StringBuilder(); char ch; if (length == 0) { while ((ch =Convert.ToChar(unitBuff[fieldPos++])) != (char)DELIMITERS.FT) sb.Append(ch); } else { for (int t = 0; t < length; t++) { ch = Convert.ToChar(unitBuff[fieldPos++]); sb.Append(ch); } } subRecord.type = ISO_8211_Record_DataDesc.FORMAT_CONTROL.A; subRecord.value = Encoding.ASCII.GetBytes(sb.ToString()); break; case ISO_8211_Record_DataDesc.FORMAT_CONTROL.I: break; case ISO_8211_Record_DataDesc.FORMAT_CONTROL.R: break; case ISO_8211_Record_DataDesc.FORMAT_CONTROL.B: break; case ISO_8211_Record_DataDesc.FORMAT_CONTROL.b1: buff = new byte[length]; Array.Copy(unitBuff, fieldPos, buff, 0, length); fieldPos += length; subRecord.type = ISO_8211_Record_DataDesc.FORMAT_CONTROL.b1; subRecord.value = buff; break; case ISO_8211_Record_DataDesc.FORMAT_CONTROL.b2: buff = new byte[length]; Array.Copy(unitBuff, fieldPos, buff, 0, length); fieldPos += length; subRecord.type = ISO_8211_Record_DataDesc.FORMAT_CONTROL.b2; subRecord.value = buff; break; case ISO_8211_Record_DataDesc.FORMAT_CONTROL.b4: buff = new byte[length]; Array.Copy(unitBuff, fieldPos, buff, 0, length); fieldPos += length; subRecord.type = ISO_8211_Record_DataDesc.FORMAT_CONTROL.b4; subRecord.value = buff; break; default: break; } return fieldPos; }
//Load Data Record private void Load_DataRecord(ISO_8211_DataRecord dataRecord, int fullPos) { ISO_8211_Leader leader = dataRecord.leader; List<ISO_8211_Directory> dirList = dataRecord.directoryList; Dictionary<string, ISO_8211_Record_DataDesc> ddrList = ((ISO_8211_DataRecordHeader)recordList[0]).ddrList; dataRecord.records = new List<ISO_8211_Record_Field>(); byte[] recordBuff = new byte[leader.rl - leader.bafa]; Array.Copy(fullData, leader.bafa + fullPos, recordBuff, 0, leader.rl - leader.bafa); int unitPos = 0; for (int i = 0; i < dirList.Count; i++) { string recordTag = new string(dirList[i].Tag); ISO_8211_Record_DataDesc ddr = ddrList[recordTag]; ISO_8211_Record_Field record = new ISO_8211_Record_Field(); record.tag = recordTag; int fieldLength = dirList[i].Length; byte[] unitBuff = new byte[fieldLength]; Array.Copy(recordBuff, unitPos, unitBuff, 0, fieldLength); unitPos += fieldLength; int fieldPos = 0; if (ddr.array_desc_str[0].Equals('*')) { while (unitBuff[fieldPos] != (int)DELIMITERS.UT) { for (int k = 0; k < ddr.array_descriptions.Count; k++) { string tag = ddr.array_descriptions[k]; ISO_8211_Record_DataDesc.FormatControl fc = ddr.format_controls[k]; ISO_8211_Record_SubField subRecord = new ISO_8211_Record_SubField(); fieldPos = subRecordBinding(fc, unitBuff, fieldPos, subRecord); subRecord.tag = tag; record.subRecords.Add(subRecord); } } } else { for (int z = 0; z < ddr.array_descriptions.Count; z++) { string tag = ddr.array_descriptions[z]; ISO_8211_Record_DataDesc.FormatControl fc = ddr.format_controls[z]; int length = fc.length; if (tag[0].Equals('\\') && tag[1].Equals('*')) { string[] tags = tag.Substring(2).Split('!'); while (unitBuff[fieldPos] != (int)DELIMITERS.UT) { for (int k = 0; k < tags.Length; k++) { string nextTag = tags[k]; ISO_8211_Record_DataDesc.FormatControl nextFc = ddr.format_controls[z+k]; ISO_8211_Record_SubField subRecord = new ISO_8211_Record_SubField(); fieldPos = subRecordBinding(nextFc, unitBuff, fieldPos, subRecord); subRecord.tag = nextTag; record.subRecords.Add(subRecord); } } } else { ISO_8211_Record_SubField subRecord = new ISO_8211_Record_SubField(); fieldPos = subRecordBinding(fc, unitBuff, fieldPos, subRecord); subRecord.tag = tag; record.subRecords.Add(subRecord); } } } dataRecord.records.Add(record); } }