From 570a6efb289f18f9799ee4bc9c48c784782f0f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 1 Oct 2022 00:56:01 +0800 Subject: [PATCH] finish EncodeLen --- len.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 len.go diff --git a/len.go b/len.go new file mode 100644 index 0000000..21f4746 --- /dev/null +++ b/len.go @@ -0,0 +1,54 @@ +package unibase2n + +import "math/bits" + +// EncodeLen calculate encode length +// offset will be appended as til+offset at last +func (bs Base) EncodeLen(in int) (out, offset int) { + if in <= 0 { + return 0, 0 + } + if bits.OnesCount8(bs.bit) == 1 { // 2的幂永无offset (1/2/4/8) + return in * (16 >> "\x00\x00\x01\x00\x02\x00\x00\x00\x03"[bs.bit]), 0 + } + if bs.bit == 6 { // 特判 (6) 3*8=4*6 + out = in / 3 * 4 * 2 + offset = in % 3 + if offset == 0 { + return + } + // 8 = 6+2, 16 = 6+6+4, 再加结尾指示字符 + out += (offset + 1 + 1) * 2 + return + } + if bs.bit < 8 { // (3/5/7) + out = in / int(bs.bit) * 8 * 2 + offset = in % int(bs.bit) + if offset == 0 { + return + } + remain := offset * 8 + out += (remain/int(bs.bit) + 1 + 1) * 2 + return + } + if bs.bit%2 == 0 { // bit 大于8且可被2整除 (10/12/14) + hb := int(bs.bit) >> 1 + out = in / hb * 8 * 2 + offset = in % hb + if offset == 0 { + return + } + remain := offset * 8 + out += (remain/int(bs.bit) + 1 + 1) * 2 + return + } + // (9/11/13/15) + out = in / int(bs.bit) * 16 * 2 + offset = in % int(bs.bit) + if offset == 0 { + return + } + remain := offset * 8 + out += (remain/int(bs.bit) + 1 + 1) * 2 + return +}