// 将通讯包转换为便于处理的行格式,放入m_LineArray中 // 注意本函数需在LoadPackage()函数后使用。 // 本函数把子包中的内容当作C语言字符串处理,将一个子包拆分为若干个字符串。 // 返回-1表示失败。 public int Parse(PackageFormat format) { Int32 lPackageLen; Int32 lBaoLen; Int32 lPathLen; int i; int wholelen,len; //char far *lpBao; //char far *lpPath; int j; Int32 lMask; // char *src = (char *)m_baPackage.GetData(); Cell cell = null; int nOffs = 0; //byte [] baPath = null; //byte [] baBao = null; int nPathStart = -1; int nBaoStart = -1; this.Clear(); ContinueString = ""; ContinueBytes = null; lPackageLen = BitConverter.ToInt32(m_baPackage, 0); Debug.Assert( lPackageLen == m_baPackage.Length, "包头部尺寸不正确"); // pp = src + 4; nOffs += 4; Int32 lWholeLen = 4; for(i=0;;i++) { lPathLen = BitConverter.ToInt32(m_baPackage, nOffs); Debug.Assert(lPathLen < 1000, "lPathLen不正确"); // lpPath = pp + 4; nPathStart = nOffs + 4; nOffs += lPathLen; lWholeLen += lPathLen; if (lWholeLen >= lPackageLen) break; if (lWholeLen == lPackageLen) { // 没有枚举部分 lBaoLen = 0; lMask = 0; } else { lBaoLen = BitConverter.ToInt32(m_baPackage, nOffs); lMask = BitConverter.ToInt32(m_baPackage, nOffs + 8); } if ((lMask & DtlpChannel.TypeBreakPoint) != 0) { if (lBaoLen > 12) { // lpBao = pp+12; len = strlen(m_baPackage, nOffs + 12) + 1; ContinueString = Encoding.GetEncoding(936).GetString(m_baPackage, nOffs+12, len-1); // 兼容模块 ContinueBytes = new byte[len-1]; Array.Copy(m_baPackage, nOffs+12, ContinueBytes, 0, len -1); } goto SKIP; } //lpBao = pp+12; // 8 if (lWholeLen == lPackageLen) nBaoStart = -1; else nBaoStart = nOffs + 12; // 将通讯包转换为以子包为单元的格式,放入m_LineArray中 // 本函数不把子包中的内容当作C语言字符串处理。 // 注意! pCell->ContentBytes中字符集未作转换(其它成员已经转换)。可能有以下几种形式: // 1)C语言字符串形式。DBCS/UTF8字符集。 // 2)MARC记录。前面9字节为二进制内容,后面为C语言字符串。这样,就不能把整个ContentBytes // 当作一个字符串进行翻译,因为前面9字节中间可能包含0字符,将导致字符串终止。 // 时间戳和MARC记录在一起的用法现在看来是一个大败笔。 // 返回-1表示失败。 if (format == PackageFormat.Binary) { // lMask cell = new Cell(); this.Add(cell); cell.Mask = lMask; if (lPathLen > 0 && m_baPackage[nPathStart] != 0) { Debug.Assert(nPathStart!=-1, "nPathStart尚未初始化"); Debug.Assert(strlen(m_baPackage, nPathStart) == lPathLen-4-1, "lPathLen值不正确"); cell.Path += m_encoding.GetString(m_baPackage, nPathStart, lPathLen-4-1); cell.Lead += m_encoding.GetString(m_baPackage, nPathStart, lPathLen-4-1); /* // 最后一个字符不是'/'。即便为UTF8字符集,这里仍可以使用DBCS判断法。 if (cell.Path.Length !=0 && cell.Path[Math.Max(0, cell.Path.Length-1)] != '/' ) cell.Path += "/"; */ } if (lWholeLen == lPackageLen) break; if (lBaoLen <= 12) goto SKIP; // 枚举部分,当作一个整体 Debug.Assert( lBaoLen >= 12 , "lBaoLen不正确"); if (lBaoLen > 12) // 正好== 12,不做 { cell.ContentBytes = new byte[lBaoLen - 12]; Array.Copy(m_baPackage, nBaoStart, cell.ContentBytes, 0, lBaoLen - 12); } } // nOffs += 12; if (lBaoLen <= 12) goto SKIP; if (format == PackageFormat.String) { for(len=0,wholelen=0,j=0;;j++) { // lMask cell = new Cell(); this.Add(cell); cell.Mask = lMask; if (lPathLen > 0 && m_baPackage[nPathStart] != 0) { Debug.Assert(nPathStart!=-1, "nPathStart尚未初始化"); Debug.Assert(strlen(m_baPackage, nPathStart) == lPathLen-4-1, "lPathLen值不正确"); cell.Path += m_encoding.GetString(m_baPackage, nPathStart, lPathLen-4-1); cell.Lead += m_encoding.GetString(m_baPackage, nPathStart, lPathLen-4-1); // 最后一个字符不是'/'。即便为UTF8字符集,这里仍可以使用DBCS判断法。 if (cell.Path.Length !=0 && cell.Path[Math.Max(0, cell.Path.Length-1)] != '/' ) cell.Path += "/"; } /* if (*lpPath) { // jia ASSERT(strlen(lpPath)==(unsigned int)lPathLen-4L-1L); if (nSrcCharset == CHARSET_UTF8) { CAdvString advstrPath; advstrPath.SetString(lpPath, nSrcCharset == CHARSET_UTF8 ? _CHARSET_UTF8 : _CHARSET_DBCS); pCell->Path += (LPCTSTR)advstrPath; pCell->Lead += (LPCTSTR)advstrPath; } else { // DBCS时间优化,避免一次多余的复制 pCell->Path += (LPCSTR)lpPath; pCell->Lead += (LPCSTR)lpPath; } // 最后一个字符不是'/'。即便为UTF8字符集,这里仍可以使用DBCS判断法。 if ( strlen(lpPath)!=0 && *(lpPath+max(0,strlen(lpPath)-1))!='/' ) pCell->Path += _T("/"); } */ if (lBaoLen <= 12L) break; len = strlen(m_baPackage, nBaoStart) + 1; cell.Path += m_encoding.GetString(m_baPackage, nBaoStart, len-1); cell.Content += m_encoding.GetString(m_baPackage, nBaoStart, len-1); wholelen += len; if (wholelen >= lBaoLen-12) // 8 break; nBaoStart += len; } } SKIP: //pp+= lBaoLen; nOffs += lBaoLen; lWholeLen += lBaoLen; if (lWholeLen >= lPackageLen) break; } return i; // lTgtPos }