mirror of
https://github.com/fumiama/unibase2n.git
synced 2026-06-10 19:50:25 +08:00
finish EncodeLen
This commit is contained in:
54
len.go
Normal file
54
len.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user