/** * разбираем группу для подбора арматуры * Документ 28 // 2 int кол-во байт в названии группы // x string название группы // 80 string C255, остальные нулевые // 8 double сопротивление стали // 8 - нулевые байты // 8 double gamma_C // 8 double FC // 1 - 1-группа, 0-конструктивный элемент // 2 - нулевые байты // 8 double коэффициент расчетной длины XoZ // 8 double коэффициент расчетной длины XoY // 64 - нулевые байты // 4 int кол-во элементов // x int номера элементов друг за другом по 4 байта * * @param String $s * @return Array */ function get_from_spr($s) { $pos = 0; //кол-во байт в названии группы $group_name_byte_count = unpackInt_2(substr($s, $pos, 2)); $pos += 2; //название группы $this->name = (string) substr($s, $pos, $group_name_byte_count); $pos += $group_name_byte_count; //класс стали, используем только 10 символов из 80 $this->steel = (string) substr($s, $pos, 10); $pos += 80; //сопротивление стали $this->Ry = unpackDouble(substr($s, $pos, 8)); $pos += 8; //пропускаем пустые 8 байт $pos += 8; //gamma_C $this->gamma_c = unpackDouble(substr($s, $pos, 8)); $pos += 8; //гибкость $this->FC = unpackDouble(substr($s, $pos, 8)); $pos += 8; //тип группы, пропуск 2-х пустых $this->group_type = unpackInt_1(substr($s, $pos, 1)); $pos += 3; //коэффициенты расчетной длины $this->mu_XZ = unpackDouble(substr($s, $pos, 8)); $pos += 8; $this->mu_XY = unpackDouble(substr($s, $pos, 8)); $pos += 8; //пропускаем пустые 64 байта $pos += 64; //кол-во элементов $member_count = unpackInt_4(substr($s, $pos, 4)); $pos += 4; //номера элементов $this->list = array(); for ($i = 1; $i <= $member_count; $i++) { $this->list[] = unpackInt_4(substr($s, $pos, 4)); $pos += 4; } }
function get_from_scad_spr($s) { mysql_query("TRUNCATE TABLE " . member_group_for_steel); $group = new MemberGroupSteel11(); //начинаем чтение с кол-ва групп $pos = 80 + 4 * 8 + 1; $group_count = unpackInt_4(substr($s, $pos, 4)); $pos += 4; //перебор строк for ($i = 1; $i <= $group_count; $i++) { //кол-во байт в названии группы $group_name_byte_count = unpackInt_2(substr($s, $pos, 2)); //кол-во элементов $member_count = unpackInt_4(substr($s, $pos + 2 + $group_name_byte_count + 80 + 4 * 8 + 1 + 2 + 2 * 8 + 64, 4)); //получаем часть данных, описание текущей группы $gap = 2 + $group_name_byte_count + 80 + 4 * 8 + 1 + 2 + 2 * 8 + 64 + 4 + $member_count * 4; $group->get_from_spr(substr($s, $pos, $gap)); $pos += $gap; //запись в базу данных mysql_query("INSERT IGNORE INTO " . member_group_for_steel . " SET\n steel = '{$group->steel}',\n Ry = '{$group->Ry}',\n gamma_c = '{$group->gamma_c}',\n FC = '{$group->FC}',\n group_type = '{$group->group_type}',\n mu_XZ = '{$group->mu_XZ}',\n mu_XY = '{$group->mu_XY}',\n name = '" . iconv('Windows-1251', 'UTF-8', $group->name) . "',\n list = '" . implode(' ', $group->list) . "'"); } }
//*schema*_int32 - offset описания документов fseek($f, 8); // (int) 4 - offset описания документов $docDescriptionOffset = bytes2un_int(fread($f, 4)); // Минимальный offset $minDocOffset = $docDescriptionOffset; // Читаем массив адресов документов в конце файла // Переходим на первый документ fseek($f, $docDescriptionOffset); $document = array(); // Добавляем пустой элемент для документа No.0 $document[0] = 0; $isFinalDoc = FALSE; while ($isFinalDoc === FALSE) { // читаем номер документа $number = unpackInt_2(fread($f, 2)); // если номер положителен, читаем offset и count if ($number > 0) { $offset = unpackInt_4(fread($f, 4)); $count = unpackInt_4(fread($f, 4)); $doc = new TDoc($number, $offset, $count); $document[$number] = $doc; // echo "$doc->number - $doc->byte_offset - $doc->byte_count<br/>"; if ($doc->byte_offset < $minDocOffset) { $minDocOffset = $doc->byte_offset; } } else { $isFinalDoc = TRUE; } } // Добавляем документ No.0