// Возвращает пары <заголовок атрибутов блока, заголовок данных блока> на основании ЧАСТИ оглавления файла func readPartTOC(data []byte, pathHeader header, pairs *[]headersPair) (err error) { utils.AddTextToLog(utils.LogLevel_TRACE, "Начало чтения части оглавления") dataTOC := getRegion(data, pathHeader) addres := addresInTOC{} addresPath := addres.getElementSize() bytesInElement := addres.getSize() elements := len(dataTOC) / bytesInElement utils.AddTextToLog(utils.LogLevel_TRACE, "Резмер данных оглавления: "+utils.IntToString(len(dataTOC))) utils.AddTextToLog(utils.LogLevel_TRACE, "Количество элементов в оглавлении: "+utils.IntToString(elements)) for i := 0; i < elements; i++ { startPos := i * bytesInElement blockAttrs := dataTOC[startPos : startPos+addresPath] blockData := dataTOC[startPos+addresPath : startPos+addresPath+addresPath] attrsPos := int(utils.BytesToInt32(blockAttrs)) dataPos := int(utils.BytesToInt32(blockData)) if !isHeader(data, attrsPos) || !isHeader(data, dataPos) { continue } attrsHeader, err := createHeader(data, attrsPos) if err != nil { break } dataHeader, err := createHeader(data, dataPos) if err != nil { break } if !attrsHeader.isAttributesData(data) || dataHeader.getDataSize() == 0 { continue } var newPair headersPair newPair.attrs = *attrsHeader newPair.data = *dataHeader *pairs = append(*pairs, newPair) } utils.AddTextToLog(utils.LogLevel_TRACE, "-Окончание чтения части оглавления") return }
// Найти заголовки блоков оглавления (оглавление может состоять из нескольских блоков) // @param данные файла // @result заголовки областей оглавления, описание ошибки (если есть) func findTOC(data []byte) (headerTOC []header, err error) { utils.AddTextToLog(utils.LogLevel_TRACE, "Начало поиска оглавления") err = errors.New("Оглавление не найдено") var previousHeader *header for i := 0; i < len(data); i++ { if !isHeader(data, i) { continue } err = nil utils.AddTextToLog(utils.LogLevel_TRACE, "Позиция части оглавления: "+utils.IntToString(i)) previousHeader, err = createHeader(data, i) break } for true { if err != nil { headerTOC = make([]header, 0) break } headerTOC = append(headerTOC, *previousHeader) if previousHeader.getNextHeaderPosition() == 0 { break } else { i := previousHeader.getNextHeaderPosition() if i > len(data) { break } utils.AddTextToLog(utils.LogLevel_TRACE, "Позиция части оглавления: "+utils.IntToString(i)) previousHeader, err = createHeader(data, i) } } utils.AddTextToLog(utils.LogLevel_TRACE, "-Окончание поиска оглавления") return }
// Возвращает пары <заголовок атрибутов блока, заголовок данных блока> на основании оглавления файла func readTOC(data []byte) (pairs []headersPair, err error) { utils.AddTextToLog(utils.LogLevel_TRACE, "Начало чтения оглавления") pairs = make([]headersPair, 0) headersTOC, err := findTOC(data) if err == nil { for _, h := range headersTOC { err = readPartTOC(data, h, &pairs) if err != nil { pairs = make([]headersPair, 0) break } } } utils.AddTextToLog(utils.LogLevel_TRACE, "-Окончание чтения оглавления. Найдено блоков: "+utils.IntToString(len(pairs))) return }