// Возвращает данные атрибутов для конфигурационного файла func (a attributes) getData() []byte { var unknowBlock []byte if len(a.name) == 0 { unknowBlock = utils.Int32ToBytes(emptyValue) } else { unknowBlock = []byte{0x00, 0x00, 0x00, 0x00} } data := []byte{} utils.AddToSlice(&data, utils.Int64ToBytes(a.creationDate), utils.Int64ToBytes(a.modificationDate), utils.Int32ToBytes(a.groupType), utils.Utf8ToUtf16([]rune(a.name)), unknowBlock) return data }
// Добавляет оглавление группового блока func addTableOfContent(fileData *[]byte, addresses []addresInTOC) { utils.AddTextToLog(utils.LogLevel_TRACE, "Начало добавления оглавления") addres := addresInTOC{} delimetr := utils.Int32ToBytes(emptyValue) countBlocks := len(addresses) valuableTOCSize := addres.getSize() * countBlocks fullTOCSize := valuableTOCSize if fullTOCSize < defaultBlockSize { fullTOCSize = defaultBlockSize } data := []byte{} utils.AddToSlice(&data, groupBlocksFlag, // маркер группы utils.Int32ToBytes(defaultBlockSize), // размер блока по умолчанию []byte{0x00, 0x00, 0x00, 0x00}, // unknown []byte{0x00, 0x00, 0x00, 0x00}, // unknown getHeaderForCf(valuableTOCSize, fullTOCSize)) // Заголовок области оглавления beginFileDataLen := int32(len(data) + fullTOCSize) for _, v := range addresses { utils.AddToSlice(&data, utils.Int32ToBytes(v.AttrsPos+beginFileDataLen), // позиция заголовка атрибутов блока utils.Int32ToBytes(v.DataPos+beginFileDataLen), // позиция заголовка данных блока delimetr) // макер разделителя адресов } emptyData := []byte{} if valuableTOCSize < fullTOCSize { emptyData = make([]byte, fullTOCSize-valuableTOCSize) } data = append(data, emptyData...) *fileData = append(data, (*fileData)...) utils.AddTextToLog(utils.LogLevel_TRACE, "-Окончание добавления оглавления") }
// Создать заголовок описывающий область файла // @param - все данные файла // @param - поизиция, с которой выполнять чтение // // @result - заголовок и информация об ошибке если таковая имеется func createHeader(data []byte, headerPosition int) (h *header, err error) { pos := headerPosition + len(beginHeaderMarker) values := bytes.Fields(data[pos : pos+valueHeaderSize-1]) // "000000ac 00000200 00000200" => [000000ac, 00000200, 00000200] err = nil if len(values) != 3 { err = errors.New("Ошибка чтения значений заголовка.") } if err == nil { nextHeaderPos := int(utils.HexToInt(values[2])) if bytes.Equal(utils.Int32ToBytes(int32(nextHeaderPos)), utils.Int32ToBytes(emptyValue)) { nextHeaderPos = 0 } h = &header{regionPosition: headerPosition + fullHeaderSize, valuableRegionSize: int(utils.HexToInt(values[0])), // 000000ac -> 172 totalRegionSize: int(utils.HexToInt(values[1])), // 00000200 -> 512 nextHeaderPosition: nextHeaderPos} // 00000200 -> 512 } return }
// Возвращает количество байт одного из значений адреса таблицы оглавления: // - 4 байта (Позиция заголовка атрибутов) // - 4 байта (Позиция заголовка данных) // - 4 байта (Разделитель адресов - emptyValue) func (a addresInTOC) getElementSize() int { return len(utils.Int32ToBytes(a.AttrsPos)) // = 4 }