/// <summary> /// 将每个 AI 编码及其对应的数据编码部分分离出来,以键值对的形式存入 List /// </summary> /// <returns></returns> private void ParseInput() { if (rawData[0] != '(') { throw new ArgumentException("GS1-128 编码必须以小括号括起的 AI 代码开始!"); } aiSet.Clear(); int left = -1; //左括号位置索引 int right = -1; //右括号位置索引 StringBuilder ai_Num = new StringBuilder(); StringBuilder ai_Data = new StringBuilder(); for (int i = 0; i < rawData.Length; i++) { if (rawData[i] == '(') { left = i; right = -1; if (ai_Num.Length != 0) { aiSet.Add(new KeyValuePair <string, string>(ai_Num.ToString(), ai_Data.ToString())); } ai_Num.Clear(); ai_Data.Clear(); continue; } else if (rawData[i] == ')') { right = i; left = -1; continue; } if (left != -1 && i > left) { ai_Num.Append(rawData[i]); } if (right != -1 && i > right) { ai_Data.Append(rawData[i]); } } aiSet.Add(new KeyValuePair <string, string>(ai_Num.ToString(), ai_Data.ToString())); //检查 AI 合法性 foreach (var pair in aiSet) { if (!CheckNumericOnly(pair.Key)) { throw new ArgumentException("小括号中的 AI 代码必须为数字!"); } AI_Struct ai_struct = ais[pair.Key]; CheckAIData(ai_struct, pair.Value); //加入提示 Errors.Add("(" + ai_struct.AI_Num + "):" + ai_struct.Name); } }
/// <summary> /// 检查 AI 数据编码部分是否合法 /// </summary> /// <param name="ai"></param> /// <param name="ai_data"></param> public void CheckAIData(AI_Struct ai, string ai_data) { if (ai_data.Length < ai.MinLen || ai_data.Length > ai.MaxLen) { throw new ArgumentException("AI:" + ai + "的数据编码部分长度不正确!"); } if (ai.Comprise == CharType.Number) { if (!CheckNumericOnly(ai_data)) { throw new ArgumentException("AI:" + ai + "的数据编码部分只能为数字!"); } } else { foreach (char c in ai_data) { if (!CheckChar(c)) { throw new ArgumentException("AI:" + ai + "的数据编码部分存在非法字符!"); } } } }