// Возвращает пары <заголовок атрибутов блока, заголовок данных блока> на основании ЧАСТИ оглавления файла 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 }
// Создает объект с данными атрибутов блока 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 }