mirror of
https://github.com/fumiama/go-base16384.git
synced 2026-06-05 00:32:52 +08:00
name old time/op new time/op delta EncodeTo/16-8 45.5ns ± 1% 35.9ns ± 1% -21.01% (p=0.008 n=5+5) EncodeTo/256-8 241ns ± 1% 170ns ± 1% -29.64% (p=0.008 n=5+5) EncodeTo/4K-8 2.90µs ± 0% 1.70µs ± 0% -41.60% (p=0.008 n=5+5) EncodeTo/32K-8 23.5µs ± 2% 13.6µs ± 2% -42.20% (p=0.008 n=5+5) DecodeTo/16-8 20.2ns ± 0% 10.3ns ± 2% -48.92% (p=0.008 n=5+5) DecodeTo/256-8 141ns ± 1% 71ns ± 0% -49.55% (p=0.008 n=5+5) DecodeTo/4K-8 2.03µs ± 1% 0.94µs ± 0% -53.82% (p=0.008 n=5+5) DecodeTo/32K-8 16.1µs ± 0% 7.5µs ± 0% -53.22% (p=0.008 n=5+5) name old speed new speed delta EncodeTo/16-8 352MB/s ± 1% 445MB/s ± 1% +26.59% (p=0.008 n=5+5) EncodeTo/256-8 1.06GB/s ± 1% 1.51GB/s ± 1% +42.13% (p=0.008 n=5+5) EncodeTo/4K-8 1.41GB/s ± 0% 2.42GB/s ± 0% +71.24% (p=0.008 n=5+5) EncodeTo/32K-8 1.40GB/s ± 2% 2.42GB/s ± 2% +73.01% (p=0.008 n=5+5) DecodeTo/16-8 1.09GB/s ± 0% 2.14GB/s ± 2% +95.84% (p=0.008 n=5+5) DecodeTo/256-8 2.10GB/s ± 1% 4.16GB/s ± 0% +98.21% (p=0.008 n=5+5) DecodeTo/4K-8 2.30GB/s ± 1% 4.99GB/s ± 0% +116.55% (p=0.008 n=5+5) DecodeTo/32K-8 2.33GB/s ± 0% 4.98GB/s ± 0% +113.78% (p=0.008 n=5+5)
139 lines
2.2 KiB
Go
139 lines
2.2 KiB
Go
// Package base14 base16384 的 go 接口
|
|
package base14
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
//go:nosplit
|
|
func EncodeLen(in int) (out int) {
|
|
out = in / 7 * 8
|
|
offset := in % 7
|
|
switch offset { //算上偏移标志字符占用的2字节
|
|
case 0:
|
|
break
|
|
case 1:
|
|
out += 4
|
|
case 2, 3:
|
|
out += 6
|
|
case 4, 5:
|
|
out += 8
|
|
case 6:
|
|
out += 10
|
|
}
|
|
return
|
|
}
|
|
|
|
func Encode(b []byte) (encd []byte) {
|
|
outlen := len(b) / 7 * 8
|
|
offset := len(b) % 7
|
|
switch offset { //算上偏移标志字符占用的2字节
|
|
case 0:
|
|
break
|
|
case 1:
|
|
outlen += 4
|
|
case 2, 3:
|
|
outlen += 6
|
|
case 4, 5:
|
|
outlen += 8
|
|
case 6:
|
|
outlen += 10
|
|
}
|
|
encd = make([]byte, outlen)
|
|
encode(offset, outlen, append(b, 0), encd)
|
|
return
|
|
}
|
|
|
|
func EncodeTo(b, encd []byte) error {
|
|
outlen := len(b) / 7 * 8
|
|
offset := len(b) % 7
|
|
switch offset { //算上偏移标志字符占用的2字节
|
|
case 0:
|
|
break
|
|
case 1:
|
|
outlen += 4
|
|
case 2, 3:
|
|
outlen += 6
|
|
case 4, 5:
|
|
outlen += 8
|
|
case 6:
|
|
outlen += 10
|
|
}
|
|
if len(encd) < outlen {
|
|
return errors.New("encd too small")
|
|
}
|
|
encode(offset, outlen, append(b, 0), encd)
|
|
return nil
|
|
}
|
|
|
|
//go:nosplit
|
|
func DecodeLen(in, offset int) (out int) {
|
|
out = in
|
|
switch offset { //算上偏移标志字符占用的2字节
|
|
case 0:
|
|
break
|
|
case 1:
|
|
out -= 4
|
|
case 2, 3:
|
|
out -= 6
|
|
case 4, 5:
|
|
out -= 8
|
|
case 6:
|
|
out -= 10
|
|
}
|
|
out = out/8*7 + offset
|
|
return
|
|
}
|
|
|
|
//go:nosplit
|
|
func Decode(b []byte) (decd []byte) {
|
|
outlen := len(b)
|
|
offset := 0
|
|
if b[len(b)-2] == '=' {
|
|
offset = int(b[len(b)-1])
|
|
switch offset { //算上偏移标志字符占用的2字节
|
|
case 0:
|
|
break
|
|
case 1:
|
|
outlen -= 4
|
|
case 2, 3:
|
|
outlen -= 6
|
|
case 4, 5:
|
|
outlen -= 8
|
|
case 6:
|
|
outlen -= 10
|
|
}
|
|
}
|
|
outlen = outlen/8*7 + offset
|
|
decd = make([]byte, outlen)
|
|
decode(offset, outlen, b, decd)
|
|
return
|
|
}
|
|
|
|
//go:nosplit
|
|
func DecodeTo(b []byte, decd []byte) error {
|
|
outlen := len(b)
|
|
offset := 0
|
|
if b[len(b)-2] == '=' {
|
|
offset = int(b[len(b)-1])
|
|
switch offset { //算上偏移标志字符占用的2字节
|
|
case 0:
|
|
break
|
|
case 1:
|
|
outlen -= 4
|
|
case 2, 3:
|
|
outlen -= 6
|
|
case 4, 5:
|
|
outlen -= 8
|
|
case 6:
|
|
outlen -= 10
|
|
}
|
|
}
|
|
outlen = outlen/8*7 + offset
|
|
if len(decd) < outlen {
|
|
return errors.New("decd too small")
|
|
}
|
|
decode(offset, outlen, b, decd)
|
|
return nil
|
|
}
|