private int ParseOneEl(string sD, List <ElemDef> lE, ref int nEl, out string sF, List <string> lM) { bool bOut; string[] aF; int i, nL, nRet = AppC.RC_CANCEL; string s; ElemDef x; sF = ""; if (sD.IndexOf(sLevSign) < 0) { // это действительно детальная try { bOut = true; // Элемент присутствует в выводе if (sD[0] == ';') { sD = sD.Substring(1); bOut = false; } aF = sD.Split(aSep); nL = aF.Length - 1; if (aF[nL].Length >= 2) { i = aF[nL].IndexOf("//"); if (i > 0) { aF[nL] = aF[nL].Substring(0, i).Trim(); } if (aF[nL].Length > 0) { nL++; } } if (nL < 4) { throw new SystemException("Неверное описание:" + sD); } int iT = int.Parse(aF[1]); x = new ElemDef(nEl, aF[0], (ELTYPES)iT, aF[2], int.Parse(aF[3])); // Точность x.nTOCH = (nL >= 5) ? int.Parse(aF[4]) : 0; // Внутренний тип if (nL >= 6) { s = aF[5].Trim(); if (s.Length > 0) { x.cTYPI = s[0]; } } // Длина (внутр.) x.nLENI = (nL >= 7) ? int.Parse(aF[6]) : 0; // Имя поля if (nL >= 8) { s = aF[7].Trim(); if (s.Length > 0) { x.sFLD = s; sF = s; } } // Выражение (макросы ключевых полей) if (nL >= 9) { s = aF[8].Trim(); if (s.Length > 0) { x.sBC = s; } } // Формат представления x.sFMT = (nL >= 10) ? aF[9].Trim() : ""; if (nL >= 10) { s = aF[9].Trim(); if (s.Length > 0) { x.sFMT = s; } } // Присутствие в выходном файле x.bOUT = bOut; lE.Add(x); nEl = nEl + 1; nRet = AppC.RC_OK; } catch { nEl = -1; } } return(nRet); }
// получить все элементы уровня public string ParseOneEl(byte[] b, ref int nOfs, ElemDef xE, out object x) { DateTime d; string s = ""; long i64; double dBl; x = null; switch (xE.cTYPD) { case T_N: // Числа if ((xE.cTYPI != T_E) && (bBin == true)) { // Бинарное представление } else { // Символьное представление чисел if (xE.nTOCH == 0) { s = Encoding.ASCII.GetString(b, nOfs, xE.nLEN); nOfs = nOfs + xE.nLEN; i64 = long.Parse(s); x = i64; } else { s = Encoding.ASCII.GetString(b, nOfs, xE.nLEN - 1); s.Insert(xE.nLEN - xE.nTOCH, "."); dBl = double.Parse(s); s = dBl.ToString(); nOfs = nOfs + xE.nLEN - 1; x = dBl; } } break; case T_C: // Символьные данные if ((xE.cTYPI != T_E) && (bBin == true)) { // упакованное представление } else { // Символьное представление s = Encoding.ASCII.GetString(b, nOfs, xE.nLEN); nOfs = nOfs + xE.nLEN; } break; case T_D: // Даты if ((xE.cTYPI != T_E) && (bBin == true)) { // упакованное представление d = new DateTime(b[nOfs + 2], b[nOfs + 1], b[nOfs]); nOfs = nOfs + 3; } else { // Символьное представление s = Encoding.ASCII.GetString(b, nOfs, 6); d = DateTime.ParseExact(s, "yyMMdd", null); nOfs = nOfs + 6; } if (xE.sFMT.Length > 0) { s = d.ToString(xE.sFMT); } else { s = d.ToString("dd.MM.yyyy"); } x = d; break; } return(s); }