|
|
@ -0,0 +1,66 @@ |
|
|
|
package modhex |
|
|
|
|
|
|
|
import ( |
|
|
|
"errors" |
|
|
|
"fmt" |
|
|
|
) |
|
|
|
|
|
|
|
const hexChars = "0123456789abcdef" |
|
|
|
const modhexChars = "cbdefghijklnrtuv" |
|
|
|
|
|
|
|
var modhex2HexMap map[byte]byte |
|
|
|
var hex2ModhexMap map[byte]byte |
|
|
|
|
|
|
|
func init() { |
|
|
|
hex2ModhexMap = make(map[byte]byte) |
|
|
|
for i, h := range []byte(hexChars) { |
|
|
|
hex2ModhexMap[h] = modhexChars[i] |
|
|
|
} |
|
|
|
|
|
|
|
modhex2HexMap = make(map[byte]byte) |
|
|
|
for i, m := range []byte(modhexChars) { |
|
|
|
modhex2HexMap[m] = hexChars[i] |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// EncodeHex encodes a hex string into a modhex string
|
|
|
|
func EncodeHex(hex string) (string, error) { |
|
|
|
size := len([]byte(hex)) |
|
|
|
|
|
|
|
if size%2 == 1 { |
|
|
|
return "", errors.New("size of input hex input not even") |
|
|
|
} |
|
|
|
|
|
|
|
var modhex = make([]byte, size) |
|
|
|
|
|
|
|
for i, h := range []byte(hex) { |
|
|
|
if m, ok := hex2ModhexMap[h]; ok { |
|
|
|
modhex[i] = m |
|
|
|
} else { |
|
|
|
return "", fmt.Errorf("input not hex encoded; position %d", i) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return string(modhex), nil |
|
|
|
} |
|
|
|
|
|
|
|
// DecodeHex decodes a modhex string into a hex string
|
|
|
|
func DecodeHex(modhex string) (string, error) { |
|
|
|
size := len([]byte(modhex)) |
|
|
|
|
|
|
|
if size%2 == 1 { |
|
|
|
return "", errors.New("size of modhex input not even") |
|
|
|
} |
|
|
|
|
|
|
|
var hex = make([]byte, size) |
|
|
|
|
|
|
|
for i, m := range []byte(modhex) { |
|
|
|
if h, ok := modhex2HexMap[m]; ok { |
|
|
|
hex[i] = h |
|
|
|
} else { |
|
|
|
return "", fmt.Errorf("input not modhex encoded; position %d", i) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return string(hex), nil |
|
|
|
} |