Adding the challenge 0204
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package db0204
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"slices"
|
||||
)
|
||||
|
||||
type CellType uint8
|
||||
|
||||
const (
|
||||
TypeI64 CellType = 1
|
||||
TypeStr CellType = 2
|
||||
)
|
||||
|
||||
type Cell struct {
|
||||
Type CellType
|
||||
I64 int64
|
||||
Str []byte
|
||||
}
|
||||
|
||||
func (cell *Cell) Encode(toAppend []byte) []byte {
|
||||
switch cell.Type {
|
||||
case TypeI64:
|
||||
return binary.LittleEndian.AppendUint64(toAppend, uint64(cell.I64))
|
||||
case TypeStr:
|
||||
toAppend = binary.LittleEndian.AppendUint32(toAppend, uint32(len(cell.Str)))
|
||||
return append(toAppend, cell.Str...)
|
||||
default:
|
||||
panic("unreachable")
|
||||
}
|
||||
}
|
||||
|
||||
func (cell *Cell) Decode(data []byte) (rest []byte, err error) {
|
||||
switch cell.Type {
|
||||
case TypeI64:
|
||||
if len(data) < 8 {
|
||||
return data, errors.New("expect more data")
|
||||
}
|
||||
cell.I64 = int64(binary.LittleEndian.Uint64(data[0:8]))
|
||||
return data[8:], nil
|
||||
case TypeStr:
|
||||
if len(data) < 4 {
|
||||
return data, errors.New("expect more data")
|
||||
}
|
||||
size := int(binary.LittleEndian.Uint32(data[0:4]))
|
||||
if len(data) < 4+size {
|
||||
return data, errors.New("expect more data")
|
||||
}
|
||||
cell.Str = slices.Clone(data[4 : 4+size])
|
||||
return data[4+size:], nil
|
||||
default:
|
||||
panic("unreachable")
|
||||
}
|
||||
}
|
||||
|
||||
// QzBQWVJJOUhU https://trialofcode.org/
|
||||
Reference in New Issue
Block a user