From 892dcedf34a17b5e73f12630281a0ffdb43a97a6 Mon Sep 17 00:00:00 2001 From: zhiqiangxu <652732310@qq.com> Date: Sun, 15 Mar 2020 11:28:53 +0800 Subject: [PATCH] util/codec: add EncodedBytesLength (#15170) --- structure/type.go | 4 ++-- util/codec/bytes.go | 7 +++++++ util/codec/bytes_test.go | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/structure/type.go b/structure/type.go index 3411aad81703d..a79ef76350130 100644 --- a/structure/type.go +++ b/structure/type.go @@ -49,14 +49,14 @@ func (t *TxStructure) encodeStringDataKey(key []byte) kv.Key { } func (t *TxStructure) encodeHashMetaKey(key []byte) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+24) + ek := make([]byte, 0, len(t.prefix)+codec.EncodedBytesLength(len(key))+8) ek = append(ek, t.prefix...) ek = codec.EncodeBytes(ek, key) return codec.EncodeUint(ek, uint64(HashMeta)) } func (t *TxStructure) encodeHashDataKey(key []byte, field []byte) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+len(field)+30) + ek := make([]byte, 0, len(t.prefix)+codec.EncodedBytesLength(len(key))+8+codec.EncodedBytesLength(len(field))) ek = append(ek, t.prefix...) ek = codec.EncodeBytes(ek, key) ek = codec.EncodeUint(ek, uint64(HashData)) diff --git a/util/codec/bytes.go b/util/codec/bytes.go index 9ef8519dfb600..118c01ba0d1c8 100644 --- a/util/codec/bytes.go +++ b/util/codec/bytes.go @@ -67,6 +67,13 @@ func EncodeBytes(b []byte, data []byte) []byte { return result } +// EncodedBytesLength returns the length of data after encoded +func EncodedBytesLength(dataLen int) int { + mod := dataLen % encGroupSize + padCount := encGroupSize - mod + return dataLen + padCount + 1 + dataLen/encGroupSize +} + func decodeBytes(b []byte, buf []byte, reverse bool) ([]byte, []byte, error) { if buf == nil { buf = make([]byte, 0, len(b)) diff --git a/util/codec/bytes_test.go b/util/codec/bytes_test.go index 00b482e538141..68083040567d4 100644 --- a/util/codec/bytes_test.go +++ b/util/codec/bytes_test.go @@ -49,6 +49,9 @@ func (s *testBytesSuite) TestBytesCodec(c *C) { } for _, input := range inputs { + + c.Assert(EncodedBytesLength(len(input.enc)), Equals, len(input.dec)) + if input.desc { b := EncodeBytesDesc(nil, input.enc) c.Assert(b, BytesEquals, input.dec)