diff --git a/base14.go b/base14.go index 5e614cf..3852125 100644 --- a/base14.go +++ b/base14.go @@ -42,17 +42,19 @@ func Encode(b []byte) (encd []byte) { encd = make([]byte, outlen) var n int i := 0 + b = append(b, 0) for ; i <= len(b)-7; i += 7 { - sum := 0x000000000000003f & ((uint64)(b[i]) >> 2) - sum |= (((uint64)(b[i+1]) << 6) | ((uint64)(b[i]) << 14)) & 0x000000000000ff00 - sum |= (((uint64)(b[i+1]) << 20) | ((uint64)(b[i+2]) << 12)) & 0x00000000003f0000 - sum |= (((uint64)(b[i+2]) << 28) | ((uint64)(b[i+3]) << 20)) & 0x00000000ff000000 - sum |= (((uint64)(b[i+3]) << 34) | ((uint64)(b[i+4]) << 26)) & 0x0000003f00000000 - sum |= (((uint64)(b[i+4]) << 42) | ((uint64)(b[i+5]) << 34)) & 0x0000ff0000000000 - sum |= ((uint64)(b[i+5]) << 48) & 0x003f000000000000 - sum |= ((uint64)(b[i+6]) << 56) & 0xff00000000000000 - sum += 0x004e004e004e004e - binary.LittleEndian.PutUint64(encd[n:], sum) + shift := binary.BigEndian.Uint64(b[i:]) >> 2 + sum := shift + sum &= 0x3fff000000000000 + shift >>= 2 + sum |= shift & 0x00003fff00000000 + shift >>= 2 + sum |= shift & 0x000000003fff0000 + shift >>= 2 + sum |= shift & 0x0000000000003fff + sum += 0x4e004e004e004e00 + binary.BigEndian.PutUint64(encd[n:], sum) n += 8 } if offset > 0 { @@ -108,17 +110,19 @@ func EncodeTo(b, encd []byte) error { } var n int i := 0 + b = append(b, 0) for ; i <= len(b)-7; i += 7 { - sum := 0x000000000000003f & ((uint64)(b[i]) >> 2) - sum |= (((uint64)(b[i+1]) << 6) | ((uint64)(b[i]) << 14)) & 0x000000000000ff00 - sum |= (((uint64)(b[i+1]) << 20) | ((uint64)(b[i+2]) << 12)) & 0x00000000003f0000 - sum |= (((uint64)(b[i+2]) << 28) | ((uint64)(b[i+3]) << 20)) & 0x00000000ff000000 - sum |= (((uint64)(b[i+3]) << 34) | ((uint64)(b[i+4]) << 26)) & 0x0000003f00000000 - sum |= (((uint64)(b[i+4]) << 42) | ((uint64)(b[i+5]) << 34)) & 0x0000ff0000000000 - sum |= ((uint64)(b[i+5]) << 48) & 0x003f000000000000 - sum |= ((uint64)(b[i+6]) << 56) & 0xff00000000000000 - sum += 0x004e004e004e004e - binary.LittleEndian.PutUint64(encd[n:], sum) + shift := binary.BigEndian.Uint64(b[i:]) >> 2 + sum := shift + sum &= 0x3fff000000000000 + shift >>= 2 + sum |= shift & 0x00003fff00000000 + shift >>= 2 + sum |= shift & 0x000000003fff0000 + shift >>= 2 + sum |= shift & 0x0000000000003fff + sum += 0x4e004e004e004e00 + binary.BigEndian.PutUint64(encd[n:], sum) n += 8 } if offset > 0 { @@ -195,21 +199,17 @@ func Decode(b []byte) (decd []byte) { var n uintptr i := 0 for ; i <= outlen-7; n += 8 { - sum := binary.LittleEndian.Uint64(b[n:]) - 0x004e004e004e004e - decd[i] = byte(((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14)) - i++ - decd[i] = byte(((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20)) - i++ - decd[i] = byte(((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28)) - i++ - decd[i] = byte(((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34)) - i++ - decd[i] = byte(((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42)) - i++ - decd[i] = byte(((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48)) - i++ - decd[i] = byte(((sum & 0xff00000000000000) >> 56)) - i++ + shift := binary.BigEndian.Uint64(b[n:]) - 0x4e004e004e004e00 + shift <<= 2 + sum := shift & 0xfffc000000000000 + shift <<= 2 + sum |= shift & 0x0003fff000000000 + shift <<= 2 + sum |= shift & 0x0000000fffc00000 + shift <<= 2 + sum |= shift & 0x00000000003fff00 + binary.BigEndian.PutUint64(decd[i:], sum) + i += 7 } if offset > 0 { var tmp [8]byte @@ -269,21 +269,17 @@ func DecodeTo(b []byte, decd []byte) error { var n uintptr i := 0 for ; i <= outlen-7; n += 8 { - sum := binary.LittleEndian.Uint64(b[n:]) - 0x004e004e004e004e - decd[i] = byte(((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14)) - i++ - decd[i] = byte(((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20)) - i++ - decd[i] = byte(((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28)) - i++ - decd[i] = byte(((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34)) - i++ - decd[i] = byte(((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42)) - i++ - decd[i] = byte(((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48)) - i++ - decd[i] = byte(((sum & 0xff00000000000000) >> 56)) - i++ + shift := binary.BigEndian.Uint64(b[n:]) - 0x4e004e004e004e00 + shift <<= 2 + sum := shift & 0xfffc000000000000 + shift <<= 2 + sum |= shift & 0x0003fff000000000 + shift <<= 2 + sum |= shift & 0x0000000fffc00000 + shift <<= 2 + sum |= shift & 0x00000000003fff00 + binary.BigEndian.PutUint64(decd[i:], sum) + i += 7 } if offset > 0 { var tmp [8]byte diff --git a/conv.go b/conv.go index 714d1ba..f92af43 100644 --- a/conv.go +++ b/conv.go @@ -16,6 +16,14 @@ func UTF82UTF16BE(b []byte) ([]byte, error) { 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 { return Encode(StringToBytes(s)) } @@ -32,6 +40,14 @@ func DecodeToString(d []byte) string { 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 { d, err := UTF82UTF16BE(StringToBytes(s)) if err != nil {