/**
 * разбираем группу для подбора арматуры
 * Документ 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_spr($data)
 {
     $pos = 0;
     //кол-во байт в типе стали (ищем первое вхождение нулевого байта)
     $steelTypeByteCount = strpos($data, "");
     // класс стали
     $this->steel_type = substr($data, 0, $steelTypeByteCount);
     $pos += 80;
     // Тип группы
     $this->group_type = unpackInt_1(substr($data, $pos, 1));
     $pos += 1;
     // Тип элемента
     $this->member_type = unpackInt_1(substr($data, $pos, 1));
     $pos += 1;
     // Нулевые байты
     $pos += 3;
     // Коэффициент расчетной длины отличается от нормативных
     $this->isMuSameWithRegulation = unpackInt_1(substr($data, $pos, 1));
     $pos += 1;
     // 00 - расчетные длины, 01 - коэффициенты расчетной длины
     $this->isMuUsed = unpackInt_1(substr($data, $pos, 1));
     $pos += 1;
     // Неупругая работа (0 - нет, 1 - да)
     $this->isOnlyElastic = unpackInt_1(substr($data, $pos, 1));
     $pos += 1;
     // сопротивление стали
     $this->steel_Ry = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     //gamma_N
     $this->gamma_n = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     //gamma_C
     $this->gamma_c = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     // Нулевые байты
     $pos += 8;
     // Коэффициенты расчетной длины
     $this->mu_XZ = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     $this->mu_XY = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     // Гибкости
     $this->flexCompressed = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     $this->flexTensed = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     // Расстояние между точками раскрепления
     $this->bucklingDistance = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     // Нулевые байты
     $pos += 16;
     // Расчетные длины
     $this->length_XZ = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     $this->length_XY = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     // Неизвестные значения
     $this->noname1 = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     $this->noname2 = unpackDouble(substr($data, $pos, 8));
     $pos += 8;
     // Нулевые байты
     $pos += 8;
     // Проверка перемещений от всех нагрузок (0 - да, 1 - нет)
     $this->deflectionFromAllLoadsToBeChecked = unpackInt_1(substr($data, $pos, 1));
     $pos += 1;
     // Проверка перемещений от временных нагрузок (0 - да, 1 - нет)
     $this->deflectionFromTemporaryLoadsToBeChecked = unpackInt_1(substr($data, $pos, 1));
     $pos += 1;
     // Нулевые байты
     $pos += 32;
     // Предельные относительные перемещения
     $this->limitRelativeDisplacementFromAllLoads = unpackFloat(substr($data, $pos, 4));
     $pos += 4;
     $this->limitRelativeDisplacementFromTemporaryLoads = unpackFloat(substr($data, $pos, 4));
     $pos += 4;
     // Нулевые байты
     $pos += 22;
     // Дополнительная группа (0 - нет, 1 - да)
     $this->isGroupAdditional = unpackInt_1(substr($data, $pos, 1));
     $pos += 1;
     // Нулевые байты
     $pos += 40;
     // Предельные абсолютные перемещения
     $this->limitAbsoluteDisplacementFromAllLoads = unpackFloat(substr($data, $pos, 4));
     $pos += 4;
     $this->limitAbsoluteDisplacementFromTemporaryLoads = unpackFloat(substr($data, $pos, 4));
     $pos += 4;
 }