mirror of
https://github.com/fumiama/unibase2n.git
synced 2026-06-05 00:32:47 +08:00
62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package unibase2n
|
|
|
|
import "math/bits"
|
|
|
|
const powtab = "\x00\x04\x03\x00\x02\x00\x00\x00\x01"
|
|
|
|
// 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 << powtab[bs.bit], 0
|
|
}
|
|
if bs.bit%2 == 0 { // bit 可被2整除, 64blk (6/10/12/14)
|
|
hb := int(bs.bit) >> 1
|
|
out = in / hb * 8
|
|
offset = in % hb
|
|
if offset == 0 {
|
|
return
|
|
}
|
|
remain := offset * 8
|
|
out += (remain/int(bs.bit) + 1 + 1) * 2
|
|
return
|
|
}
|
|
// 其他奇数, 128blk (3/5/7/9/11/13/15)
|
|
out = in / int(bs.bit) * 16
|
|
offset = in % int(bs.bit)
|
|
if offset == 0 {
|
|
return
|
|
}
|
|
remain := offset * 8
|
|
out += (remain/int(bs.bit) + 1 + 1) * 2
|
|
return
|
|
}
|
|
|
|
// DecodeLen calculate decode length
|
|
// offset must be legal or out will <= 0
|
|
func (bs Base) DecodeLen(in, offset int) (out int) {
|
|
if in <= 0 || offset < 0 {
|
|
return 0
|
|
}
|
|
if bits.OnesCount8(bs.bit) == 1 { // 2的幂永无offset (1/2/4/8)
|
|
return in >> powtab[bs.bit]
|
|
}
|
|
if bs.bit%2 == 0 { // bit 可被2整除, 64blk (6/10/12/14)
|
|
hb := int(bs.bit) >> 1
|
|
if offset != 0 {
|
|
remain := offset * 8
|
|
in -= (remain/int(bs.bit) + 1) * 2
|
|
}
|
|
return (in>>3)*hb + offset
|
|
}
|
|
// 其他奇数, 128blk (3/5/7/9/11/13/15)
|
|
if offset != 0 {
|
|
remain := offset * 8
|
|
in -= (remain/int(bs.bit) + 1) * 2
|
|
}
|
|
return (in>>4)*int(bs.bit) + offset
|
|
}
|