Ejemplo n.º 1
0
        /// <summary>
        /// 获取Pure Identity URI的Tag URI以及二进制编码。在调用此方法前,必须首先
        /// 调用SetURI方法以设置Pure Identity URI,并确保SetURI方法调用成功。
        /// </summary>
        /// <param name="filter">将使用的过滤值</param>
        /// <param name="tagScheme">将使用的二进制编码方案</param>
        /// <param name="tagURI">得到的Tag URI</param>
        /// <param name="binEncoding">得到的二进制编码</param>
        /// <returns>成功返回null,错误则返回出错信息</returns>
        public string GetTagURIAndBinEncoding(byte filter, string tagScheme, ref string tagURI, ref string binEncoding)
        {
            bool lenVariable = false;
            //查找编码表的所有段
            var queryTagScheme = xDocCodingTable.Descendants("TagScheme")
                                 .Where(item => item.Attribute("name").Value == tagScheme)
                                 .FirstOrDefault();
            var    segmentList = queryTagScheme.Elements(); //包含每个段结点信息的列表
            int    totalBit    = int.Parse(queryTagScheme.Attribute("len").Value);
            BitArr result      = new BitArr(totalBit);      //按总长度创建字节数组

            //遍历每一个段,将其转化为二进制编码
            index = schemeIndex;
            foreach (var segment in segmentList)
            {
                //首部、过滤值和分区表单独处理
                if (segment.Name == "Header")//处理首部
                {
                    result.Append(byte.Parse(segment.Value),
                                  int.Parse(segment.Attributes("len").FirstOrDefault().Value));
                }
                else if (segment.Name == "Filter") //处理过滤值
                {
                    result.Append(filter,
                                  int.Parse(segment.Attributes("len").FirstOrDefault().Value));
                }
                else if (segment.Name == "Partition")//处理分区表
                {
                    //首先确定分区表名称
                    string partitionName = segment.Attributes("tableName")
                                           .FirstOrDefault().Value;
                    //找到相应分区表
                    var queryPartition = xDocPartitionTable.Descendants("Partition")
                                         .Where(item => item.Attribute("name").Value == partitionName);
                    string part1Name = queryPartition.Attributes("part1Name")
                                       .FirstOrDefault().Value;
                    string part1Method = queryPartition.Attributes("col2Method")
                                         .FirstOrDefault().Value;
                    //获取URI中的属性分区表Part1的部分
                    string part1 = GetNextSegmentInUri(part1Method);
                    if (part1 == null)
                    {
                        return(part1Name + "使用了不合法的字符");
                    }
                    int part1Len = part1.Length;
                    //根据Part1的编码字符个数查找分区表中的相应行
                    var row = queryPartition.Elements("Row")
                              .Where(item => item.Attribute("col2").Value == part1Len.ToString())
                              .Select(item => new
                    {
                        val         = item.Attribute("value").Value,
                        part1BitLen = item.Attribute("col1").Value,
                        part2BitLen = item.Attribute("col3").Value,
                        part2Len    = item.Attribute("col4").Value
                    }).FirstOrDefault();
                    if (row == null)
                    {
                        return(part1Name + "使用的字符个数不在分区表指定范围内");
                    }
                    //加入分区值
                    result.Append(byte.Parse(row.val), 3);
                    //加入分区表第一部分编码
                    int    part1BitLen = int.Parse(row.part1BitLen);
                    byte[] part1Raw    = Encode(part1, part1BitLen, part1Method);
                    if (part1Raw == null)
                    {
                        return("Part1编码失败");
                    }
                    result.AppendTrimLeft(part1Raw, part1BitLen);

                    //获取分区表第二部分指定字符个数
                    int part2Len = int.Parse(row.part2Len);
                    //查找分区表的Part2信息
                    string part2Name = queryPartition.Attributes("part2Name")
                                       .FirstOrDefault().Value;
                    string part2Method = queryPartition.Attributes("col4Method")
                                         .FirstOrDefault().Value;
                    //获取URI中的属性分区表Part2的部分
                    string part2 = GetNextSegmentInUri(part2Method);
                    if (part2 == null)
                    {
                        return(part2Name + "使用了不合法的字符");
                    }
                    //固定长度分区表列(列名不带“Max”)的合法性判断
                    if (!VerifyLength(part2, part2Len, part2Method))
                    {
                        return(part2Name + "使用的字符个数不在分区表指定范围内");
                    }
                    //加入分区表第二部分编码
                    int    part2BitLen = int.Parse(row.part2BitLen);
                    byte[] part2Raw    = Encode(part2, part2BitLen, part2Method);
                    if (part2Raw == null)
                    {
                        return("Part2编码失败");
                    }
                    if (part2Method == "Set82_max")
                    {
                        result.AppendTrimRight(part2Raw, part2BitLen);
                    }
                    else if (part2Method == "Set39_max")
                    {
                        lenVariable = true;
                        result.AppendTrimRight(part2Raw, Symbols.CalcActualLength(part2) * 6 + 6);
                    }
                    else
                    {
                        result.AppendTrimLeft(part2Raw, part2BitLen);
                    }
                }
                else //其他段共用以下处理方法
                {
                    int len = int.Parse(segment.Attributes("len")
                                        .FirstOrDefault().Value);
                    string method       = segment.Attributes("method").FirstOrDefault().Value;
                    string name         = segment.Attributes("name").FirstOrDefault().Value;
                    string segmentInUri = GetNextSegmentInUri(method);
                    if (segmentInUri == null)
                    {
                        return(name + "使用了不合法的字符");
                    }
                    else
                    {
                        byte[] raw = Encode(segmentInUri, len, method);
                        if (method == "Integer" || method == "NumericString" || method == "FixedWidthInteger")
                        {
                            result.AppendTrimLeft(raw, len);
                        }
                        else if (method == "Set82" || method == "CAGEorDoDAAC")
                        {
                            result.AppendTrimRight(raw, len);
                        }
                        else if (method == "Set39_max")
                        {
                            lenVariable = true;
                            result.AppendTrimRight(raw, Symbols.CalcActualLength(segmentInUri) * 6 + 6);
                        }
                    }
                }
            }
            if (lenVariable)
            {
                result.Trim();
            }
            binEncoding = result.ToString();
            return(null);
        }