1
0
mirror of https://github.com/fumiama/go-base16384.git synced 2026-07-02 01:50:27 +08:00

speed up & add more api

This commit is contained in:
源文雨
2022-04-22 10:32:20 +08:00
parent 851f9f8666
commit 6885586cff
2 changed files with 62 additions and 50 deletions

View File

@@ -42,17 +42,19 @@ func Encode(b []byte) (encd []byte) {
encd = make([]byte, outlen) encd = make([]byte, outlen)
var n int var n int
i := 0 i := 0
b = append(b, 0)
for ; i <= len(b)-7; i += 7 { for ; i <= len(b)-7; i += 7 {
sum := 0x000000000000003f & ((uint64)(b[i]) >> 2) shift := binary.BigEndian.Uint64(b[i:]) >> 2
sum |= (((uint64)(b[i+1]) << 6) | ((uint64)(b[i]) << 14)) & 0x000000000000ff00 sum := shift
sum |= (((uint64)(b[i+1]) << 20) | ((uint64)(b[i+2]) << 12)) & 0x00000000003f0000 sum &= 0x3fff000000000000
sum |= (((uint64)(b[i+2]) << 28) | ((uint64)(b[i+3]) << 20)) & 0x00000000ff000000 shift >>= 2
sum |= (((uint64)(b[i+3]) << 34) | ((uint64)(b[i+4]) << 26)) & 0x0000003f00000000 sum |= shift & 0x00003fff00000000
sum |= (((uint64)(b[i+4]) << 42) | ((uint64)(b[i+5]) << 34)) & 0x0000ff0000000000 shift >>= 2
sum |= ((uint64)(b[i+5]) << 48) & 0x003f000000000000 sum |= shift & 0x000000003fff0000
sum |= ((uint64)(b[i+6]) << 56) & 0xff00000000000000 shift >>= 2
sum += 0x004e004e004e004e sum |= shift & 0x0000000000003fff
binary.LittleEndian.PutUint64(encd[n:], sum) sum += 0x4e004e004e004e00
binary.BigEndian.PutUint64(encd[n:], sum)
n += 8 n += 8
} }
if offset > 0 { if offset > 0 {
@@ -108,17 +110,19 @@ func EncodeTo(b, encd []byte) error {
} }
var n int var n int
i := 0 i := 0
b = append(b, 0)
for ; i <= len(b)-7; i += 7 { for ; i <= len(b)-7; i += 7 {
sum := 0x000000000000003f & ((uint64)(b[i]) >> 2) shift := binary.BigEndian.Uint64(b[i:]) >> 2
sum |= (((uint64)(b[i+1]) << 6) | ((uint64)(b[i]) << 14)) & 0x000000000000ff00 sum := shift
sum |= (((uint64)(b[i+1]) << 20) | ((uint64)(b[i+2]) << 12)) & 0x00000000003f0000 sum &= 0x3fff000000000000
sum |= (((uint64)(b[i+2]) << 28) | ((uint64)(b[i+3]) << 20)) & 0x00000000ff000000 shift >>= 2
sum |= (((uint64)(b[i+3]) << 34) | ((uint64)(b[i+4]) << 26)) & 0x0000003f00000000 sum |= shift & 0x00003fff00000000
sum |= (((uint64)(b[i+4]) << 42) | ((uint64)(b[i+5]) << 34)) & 0x0000ff0000000000 shift >>= 2
sum |= ((uint64)(b[i+5]) << 48) & 0x003f000000000000 sum |= shift & 0x000000003fff0000
sum |= ((uint64)(b[i+6]) << 56) & 0xff00000000000000 shift >>= 2
sum += 0x004e004e004e004e sum |= shift & 0x0000000000003fff
binary.LittleEndian.PutUint64(encd[n:], sum) sum += 0x4e004e004e004e00
binary.BigEndian.PutUint64(encd[n:], sum)
n += 8 n += 8
} }
if offset > 0 { if offset > 0 {
@@ -195,21 +199,17 @@ func Decode(b []byte) (decd []byte) {
var n uintptr var n uintptr
i := 0 i := 0
for ; i <= outlen-7; n += 8 { for ; i <= outlen-7; n += 8 {
sum := binary.LittleEndian.Uint64(b[n:]) - 0x004e004e004e004e shift := binary.BigEndian.Uint64(b[n:]) - 0x4e004e004e004e00
decd[i] = byte(((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14)) shift <<= 2
i++ sum := shift & 0xfffc000000000000
decd[i] = byte(((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20)) shift <<= 2
i++ sum |= shift & 0x0003fff000000000
decd[i] = byte(((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28)) shift <<= 2
i++ sum |= shift & 0x0000000fffc00000
decd[i] = byte(((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34)) shift <<= 2
i++ sum |= shift & 0x00000000003fff00
decd[i] = byte(((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42)) binary.BigEndian.PutUint64(decd[i:], sum)
i++ i += 7
decd[i] = byte(((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48))
i++
decd[i] = byte(((sum & 0xff00000000000000) >> 56))
i++
} }
if offset > 0 { if offset > 0 {
var tmp [8]byte var tmp [8]byte
@@ -269,21 +269,17 @@ func DecodeTo(b []byte, decd []byte) error {
var n uintptr var n uintptr
i := 0 i := 0
for ; i <= outlen-7; n += 8 { for ; i <= outlen-7; n += 8 {
sum := binary.LittleEndian.Uint64(b[n:]) - 0x004e004e004e004e shift := binary.BigEndian.Uint64(b[n:]) - 0x4e004e004e004e00
decd[i] = byte(((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14)) shift <<= 2
i++ sum := shift & 0xfffc000000000000
decd[i] = byte(((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20)) shift <<= 2
i++ sum |= shift & 0x0003fff000000000
decd[i] = byte(((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28)) shift <<= 2
i++ sum |= shift & 0x0000000fffc00000
decd[i] = byte(((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34)) shift <<= 2
i++ sum |= shift & 0x00000000003fff00
decd[i] = byte(((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42)) binary.BigEndian.PutUint64(decd[i:], sum)
i++ i += 7
decd[i] = byte(((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48))
i++
decd[i] = byte(((sum & 0xff00000000000000) >> 56))
i++
} }
if offset > 0 { if offset > 0 {
var tmp [8]byte var tmp [8]byte

16
conv.go
View File

@@ -16,6 +16,14 @@ func UTF82UTF16BE(b []byte) ([]byte, error) {
return format.NewEncoder().Bytes(b) return format.NewEncoder().Bytes(b)
} }
func EncodeToString(b []byte) string {
out, err := UTF16BE2UTF8(Encode(b))
if err != nil {
return ""
}
return BytesToString(out)
}
func EncodeFromString(s string) []byte { func EncodeFromString(s string) []byte {
return Encode(StringToBytes(s)) return Encode(StringToBytes(s))
} }
@@ -32,6 +40,14 @@ func DecodeToString(d []byte) string {
return BytesToString(Decode(d)) return BytesToString(Decode(d))
} }
func DecodeFromString(s string) []byte {
d, err := UTF82UTF16BE(StringToBytes(s))
if err != nil {
return nil
}
return Decode(d)
}
func DecodeString(s string) string { func DecodeString(s string) string {
d, err := UTF82UTF16BE(StringToBytes(s)) d, err := UTF82UTF16BE(StringToBytes(s))
if err != nil { if err != nil {