dataspace

Форк
0
/
fraction.go 
53 строки · 1.6 Кб
1
package dataspace
2

3
import "encoding/binary"
4

5
type fraction struct {
6
	m byte   // mode/режим
7
	s bool   // status/статус
8
	k []byte // key/ключ
9
	v []byte // value/значение
10
}
11

12
/*
13
Функция сериализует блок данных в бинарный код. Блок состоит из метаданных размером 8 байт
14
и основой фракции пространство-ключ-значение.
15

16
Метаданные:
17

18
		         +------------+------------+------------+------------+
19
	::: name ::: | mode       | status     | key size   | value size |
20
		         +------------+------------+------------+------------+
21
	::: size ::: | 1          | 1          | 2          | 4          |
22
		         +------------+------------+------------+------------+
23
*/
24
func encode(f *fraction) []byte {
25
	b := make([]byte, 0, 8+len(f.k)+len(f.v))
26
	if f.s {
27
		b = append(b, byte(f.m), 1)
28
	} else {
29
		b = append(b, byte(f.m), 0)
30
	}
31
	b = binary.LittleEndian.AppendUint16(b, uint16(len(f.k)))
32
	b = binary.LittleEndian.AppendUint32(b, uint32(len(f.v)))
33
	b = append(b, f.k...)
34
	b = append(b, f.v...)
35
	return b
36
}
37

38
// Функция разбивает общий срез данных на блоки.
39
func decode(data []byte) []*fraction {
40
	i, fractions := 0, make([]*fraction, 0)
41
	for i < len(data) {
42
		klen := binary.LittleEndian.Uint16(data[i+2 : i+4])
43
		vlen := binary.LittleEndian.Uint32(data[i+4 : i+8])
44
		fractions = append(fractions, &fraction{
45
			m: data[i],
46
			s: data[i+1] == 1,
47
			k: data[i+8 : i+8+int(klen)],
48
			v: data[i+8+int(klen) : i+8+int(klen)+int(vlen)],
49
		})
50
		i += 8 + int(klen) + int(vlen)
51
	}
52
	return fractions
53
}
54

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.