diff --git a/multibase.go b/multibase.go index 2b56b70..24a4bd2 100644 --- a/multibase.go +++ b/multibase.go @@ -49,8 +49,10 @@ func Encode(base Encoding, data []byte) (string, error) { case Identity: // 0x00 inside a string is OK in golang and causes no problems with the length calculation. return string(Identity) + string(data), nil - case Base16, Base16Upper: + case Base16: return string(Base16) + hex.EncodeToString(data), nil + case Base16Upper: + return string(Base16Upper) + hexEncodeToStringUpper(data), nil case Base32: return string(Base32) + base32StdLowerNoPad.EncodeToString(data), nil case Base32Upper: @@ -143,3 +145,24 @@ var base32HexLowerNoPad = base32HexLowerPad.WithPadding(b32.NoPadding) var base32HexUpperPad = b32.NewEncodingCI("0123456789ABCDEFGHIJKLMNOPQRSTUV") var base32HexUpperNoPad = base32HexUpperPad.WithPadding(b32.NoPadding) + + +func hexEncodeToStringUpper(src []byte) string { + dst := make([]byte, len(src) * 2) + hexEncodeUpper(dst, src) + return string(dst) +} + +var hextableUpper = [16]byte{ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', +} + +func hexEncodeUpper(dst, src []byte) int { + for i, v := range src { + dst[i*2] = hextableUpper[v>>4] + dst[i*2+1] = hextableUpper[v&0x0f] + } + + return len(src) * 2 +} diff --git a/multibase_test.go b/multibase_test.go index 5c9ada7..e343f8c 100644 --- a/multibase_test.go +++ b/multibase_test.go @@ -10,6 +10,7 @@ var sampleBytes = []byte("Decentralize everything!!") var encodedSamples = map[Encoding]string{ Identity: string(0x00) + "Decentralize everything!!", Base16: "f446563656e7472616c697a652065766572797468696e672121", + Base16Upper: "F446563656E7472616C697A652065766572797468696E672121", Base32: "birswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb", Base32Upper: "BIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJB", Base32pad: "cirswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb",