Esempio n. 1
0
// Возвращает данные атрибутов для конфигурационного файла
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
}
Esempio n. 2
0
// Добавляет оглавление группового блока
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, "-Окончание добавления оглавления")
}
Esempio n. 3
0
// Создать заголовок описывающий область файла
// @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
}
Esempio n. 4
0
// Возвращает количество байт одного из значений адреса таблицы оглавления:
// - 4 байта (Позиция заголовка атрибутов)
// - 4 байта (Позиция заголовка данных)
// - 4 байта (Разделитель адресов - emptyValue)
func (a addresInTOC) getElementSize() int {
	return len(utils.Int32ToBytes(a.AttrsPos)) // = 4
}