Example #1
0
// Возвращает пары <заголовок атрибутов блока, заголовок данных блока> на основании ЧАСТИ оглавления файла
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
}
Example #2
0
// Найти заголовки блоков оглавления (оглавление может состоять из нескольских блоков)
// @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
}
Example #3
0
// Возвращает пары <заголовок атрибутов блока, заголовок данных блока> на основании оглавления файла
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
}