public void SkipEclipseData(EclipseHeader header) { // Если блок данных не представляет интереса, можно его пропустить. // В зависимости от типа данных, расчет количества пропускаемых байт меняется: // // "CHAR" поделен на строки по 8 символов, в одном блоке 105 строк; // "INTE, LOGI, REAL" это 4 байтные элементы, в одном блоке 1000 элементов; // "DOUB" это 8 байтные элементы, в одной блоке также 1000 элементов. // // В конце и перед началом каждого блока записано по 4 байта. Это тяжелое наследние FORTRAN. // Последний блок может быть не целым, чтобы понять сколько байт содержится в последнем блоке, // расчитывается количество целых блоков "block" и количество байт, оставшихся в последнем блоке "mod". if (header.type == "CHAR") { int block = header.count / 105; int mod = header.count - block * 105; if (block > 0) ReadBytes((2 * 4 + 8 * 105) * block); if (mod > 0) ReadBytes(2 * 4 + 8 * mod); } if (header.type == "INTE" || header.type == "LOGI" || header.type == "REAL") { int block = header.count / 1000; int mod = header.count - block * 1000; if (block > 0) ReadBytes((2 * 4 + 4 * 1000) * block); if (mod > 0) ReadBytes(2 * 4 + 4 * mod); } if (header.type == "DOUB") { int block = header.count / 1000; int mod = header.count - block * 1000; if (block > 0) ReadBytes((2 * 4 + 8 * 1000) * block); if (mod > 0) ReadBytes(2 * 4 + 8 * mod); } }
public void ReadEclipseHeader(ref EclipseHeader header) { // Перед блоком данных всегда следует заголовок, // в котором указывается имя параметра, тип и количество элементов ReadBytes(4); header.keyword = ReadString(8).Trim(); header.count = ReadInt32(); header.type = ReadString(4); ReadBytes(4); }