public string Decode(ref string pureURI) { if (code == null) { return(null); } long header = code.SubBitToInteger(0, 8); var queryTagScheme = xDocCodingTable.Descendants("TagScheme") .Where(item => item.Element("Header").Value == header.ToString()) .FirstOrDefault(); if (queryTagScheme == null) { return("首部值不存在"); } StringBuilder result = new StringBuilder(); int index = 8; foreach (var segment in queryTagScheme.Elements()) { if (segment.Name.ToString() == "Header")//首部 { result.Append(queryTagScheme.Parent.Attribute("uri").Value); TagScheme = queryTagScheme.Attribute("name").Value; } else if (segment.Name.ToString() == "Filter")//过滤值 { int len = int.Parse(queryTagScheme.Element("Filter") .Attribute("len").Value); long filter = code.SubBitToInteger(index, len); if (filter == -1) { return("过滤值解码错误"); } index += len; Filter = (int)filter; } else if (segment.Name.ToString() == "Partition") { //首先查找分区表名称 string partitionName = segment.Attribute("tableName").Value; //找到相应的分区表 var queryPartition = xDocPartitionTable.Descendants("Partition") .Where(item => item.Attribute("name").Value == partitionName); //首先获取分区值 long partVal = code.SubBitToInteger(index, 3); if (partVal == -1) { return("分区值解码错误"); } index += 3; //查找匹配分区表行 var row = queryPartition.Descendants("Row") .Where(item => item.Attribute("value").Value == partVal.ToString()) .Select(item => new { part1BitLen = item.Attribute("col1").Value, part1Len = item.Attribute("col2").Value, part2BitLen = item.Attribute("col3").Value, part2Len = item.Attribute("col4").Value }).FirstOrDefault(); //解码分区表第一部分 string part1Name = queryPartition.Attributes("part1Name").FirstOrDefault().Value; string part1Method = queryPartition.Attributes("col2Method").FirstOrDefault().Value; int len = int.Parse(row.part1BitLen); int part1Len = int.Parse(row.part1Len); string part1 = DecodeSegment(index, len, part1Len, part1Method); if (part1 == null) { return(part1Name + "段解码失败"); } index += len; result.Append(part1); //解码分区表第二部分 string part2Name = queryPartition.Attributes("part2Name").FirstOrDefault().Value; string part2Method = queryPartition.Attributes("col4Method").FirstOrDefault().Value; len = int.Parse(row.part2BitLen); int part2Len = int.Parse(row.part2Len); string part2 = DecodeSegment(index, len, part2Len, part2Method); if (part2 == null) { return(part2Name + "段解码失败"); } if (part2Method == "Set39_max") { index += Symbols.CalcActualLength(part2) * 6 + 6; } else { index += len; } result.Append('.'); result.Append(part2); } else //其它逻辑段的解码 { int len = int.Parse(segment.Attribute("len").Value); string method = segment.Attribute("method").Value; string name = segment.Attribute("name").Value; string other = DecodeSegment(index, len, -1, method); if (other == null) { return("逻辑段:" + name + "解码错误"); } if (method == "Set39_max") { index += Symbols.CalcActualLength(other) * 6 + 6; } else { index += len; } if (other == "") { continue; } result.Append('.'); result.Append(other); } } pureURI = result.ToString(); return(null); }