Esempio n. 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
}
Esempio n. 2
0
// Создает объект с данными атрибутов блока
func createAttrs(data []byte) *attributes {

	a := attributes{}
	a.creationDate = utils.BytesToInt64(data[:8])
	a.modificationDate = utils.BytesToInt64(data[8:16])
	a.groupType = int32(utils.BytesToInt32(data[16:20]))

	name_utf16 := data[20:] // n.a.m.e... ,где '.' == 0x00

	for i, symbol := range name_utf16 {
		next_symbol := byte(0x00)
		if i+1 <= len(name_utf16) {
			next_symbol = name_utf16[i+1:][0]
		}

		if symbol == 0x00 && next_symbol == 0x00 {
			break
		}

		if i%2 == 0 {
			a.name += string(symbol)
		}
	}

	return &a
}