Make base16 encoding case preserving.
This commit is contained in:
25
multibase.go
25
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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user