Go: Add base32 support library

Our base32 uses 0-9a-v with no padding. The length is hard coded to
20 bytes (and 32 characters)
This commit is contained in:
Erik Arvidsson
2016-06-23 13:30:35 +08:00
parent 777b598631
commit c0bc00dee0
2 changed files with 84 additions and 0 deletions

18
go/hash/base32.go Normal file
View File

@@ -0,0 +1,18 @@
// Copyright 2016 The Noms Authors. All rights reserved.
// Licensed under the Apache License, version 2.0:
// http://www.apache.org/licenses/LICENSE-2.0
package hash
import "encoding/base32"
var encoding = base32.NewEncoding("0123456789abcdefghijklmnopqrstuv")
func encode(data []byte) string {
return encoding.EncodeToString(data[:20]) // We only use the first remove trailing padding
}
func decode(s string) []byte {
slice, _ := encoding.DecodeString(s)
return slice
}

66
go/hash/base32_test.go Normal file
View File

@@ -0,0 +1,66 @@
// Copyright 2016 The Noms Authors. All rights reserved.
// Licensed under the Apache License, version 2.0:
// http://www.apache.org/licenses/LICENSE-2.0
package hash
import (
"testing"
"github.com/attic-labs/testify/assert"
)
func TestBase32Encode(t *testing.T) {
assert := assert.New(t)
d := make([]byte, 20, 20)
assert.Equal("00000000000000000000000000000000", encode(d))
d[19] = 1
assert.Equal("00000000000000000000000000000001", encode(d))
d[19] = 10
assert.Equal("0000000000000000000000000000000a", encode(d))
d[19] = 20
assert.Equal("0000000000000000000000000000000k", encode(d))
d[19] = 31
assert.Equal("0000000000000000000000000000000v", encode(d))
d[19] = 32
assert.Equal("00000000000000000000000000000010", encode(d))
d[19] = 63
assert.Equal("0000000000000000000000000000001v", encode(d))
d[19] = 64
assert.Equal("00000000000000000000000000000020", encode(d))
// Largest!
for i := 0; i < 20; i++ {
d[i] = 0xff
}
assert.Equal("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv", encode(d))
}
func TestBase32Decode(t *testing.T) {
assert := assert.New(t)
d := make([]byte, 20, 20)
assert.Equal(d, decode("00000000000000000000000000000000"))
d[19] = 1
assert.Equal(d, decode("00000000000000000000000000000001"))
d[19] = 10
assert.Equal(d, decode("0000000000000000000000000000000a"))
d[19] = 20
assert.Equal(d, decode("0000000000000000000000000000000k"))
d[19] = 31
assert.Equal(d, decode("0000000000000000000000000000000v"))
d[19] = 32
assert.Equal(d, decode("00000000000000000000000000000010"))
d[19] = 63
assert.Equal(d, decode("0000000000000000000000000000001v"))
d[19] = 64
assert.Equal(d, decode("00000000000000000000000000000020"))
// Largest!
for i := 0; i < 20; i++ {
d[i] = 0xff
}
assert.Equal(d, decode("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"))
}