You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

66 lines
1.3 KiB

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
}