dataspace
/
fraction.go
53 строки · 1.6 Кб
1package dataspace
2
3import "encoding/binary"
4
5type fraction struct {
6m byte // mode/режим
7s bool // status/статус
8k []byte // key/ключ
9v []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*/
24func encode(f *fraction) []byte {
25b := make([]byte, 0, 8+len(f.k)+len(f.v))
26if f.s {
27b = append(b, byte(f.m), 1)
28} else {
29b = append(b, byte(f.m), 0)
30}
31b = binary.LittleEndian.AppendUint16(b, uint16(len(f.k)))
32b = binary.LittleEndian.AppendUint32(b, uint32(len(f.v)))
33b = append(b, f.k...)
34b = append(b, f.v...)
35return b
36}
37
38// Функция разбивает общий срез данных на блоки.
39func decode(data []byte) []*fraction {
40i, fractions := 0, make([]*fraction, 0)
41for i < len(data) {
42klen := binary.LittleEndian.Uint16(data[i+2 : i+4])
43vlen := binary.LittleEndian.Uint32(data[i+4 : i+8])
44fractions = append(fractions, &fraction{
45m: data[i],
46s: data[i+1] == 1,
47k: data[i+8 : i+8+int(klen)],
48v: data[i+8+int(klen) : i+8+int(klen)+int(vlen)],
49})
50i += 8 + int(klen) + int(vlen)
51}
52return fractions
53}
54