|
|
@ -86,31 +86,40 @@ func (e InvalidByteError) Error() string { |
|
|
|
// even length. If the input is malformed, Decode returns the number of bytes
|
|
|
|
// decoded before the error.
|
|
|
|
func Decode(dst, src []byte) (int, error) { |
|
|
|
i, j := 0, 1 |
|
|
|
for ; j < len(src); j += 2 { |
|
|
|
a, ok := modhexMap[src[j-1]] |
|
|
|
// decode the src bytes two at a time
|
|
|
|
n, i := 0, 1 |
|
|
|
for ; i < len(src); i += 2 { |
|
|
|
|
|
|
|
// try to decode the upper nibble
|
|
|
|
a, ok := modhexMap[src[i-1]] |
|
|
|
if !ok { |
|
|
|
return i, InvalidByteError(src[j-1]) |
|
|
|
return n, InvalidByteError(src[i-1]) |
|
|
|
} |
|
|
|
|
|
|
|
b, ok := modhexMap[src[j]] |
|
|
|
// try to decode the lower nibble
|
|
|
|
b, ok := modhexMap[src[i]] |
|
|
|
if !ok { |
|
|
|
return i, InvalidByteError(src[j]) |
|
|
|
return n, InvalidByteError(src[i]) |
|
|
|
} |
|
|
|
|
|
|
|
dst[i] = (a << 4) | b |
|
|
|
i++ |
|
|
|
// store the decoded value into dst
|
|
|
|
dst[n] = (a << 4) | b |
|
|
|
n++ |
|
|
|
} |
|
|
|
|
|
|
|
// check for an odd length input
|
|
|
|
if len(src)%2 == 1 { |
|
|
|
if _, ok := modhexMap[src[j-1]]; !ok { |
|
|
|
return i, InvalidByteError(src[j-1]) |
|
|
|
// first check for an invalid byte
|
|
|
|
if _, ok := modhexMap[src[i-1]]; !ok { |
|
|
|
return n, InvalidByteError(src[i-1]) |
|
|
|
} |
|
|
|
|
|
|
|
return i, ErrLength |
|
|
|
// report the number of bytes written and the length error
|
|
|
|
return n, ErrLength |
|
|
|
} |
|
|
|
|
|
|
|
return i, nil |
|
|
|
// return the number of bytes written to dst
|
|
|
|
return n, nil |
|
|
|
} |
|
|
|
|
|
|
|
// DecodeString returns the bytes represented by the modhex string s.
|
|
|
|