package yu_hex

import (
	yu_const "gogs.qqck.cn/s/tools/const"
)

// Lower
//
//	@Description: 编码为小写hex
func Lower(buf []byte) string {
	j_buf := make([]byte, 0, len(buf)*2)
	for _, j_byte := range buf {
		j_buf = append(j_buf, yu_const.HexLower[j_byte>>4])
		j_buf = append(j_buf, yu_const.HexLower[j_byte&0x0f])
	}
	return string(j_buf)
}

// Upper
//
//	@Description: 编码为大写hex
func Upper(buf []byte) string {
	j_buf := make([]byte, 0, len(buf)*2)
	for _, j_byte := range buf {
		j_buf = append(j_buf, yu_const.HexUpper[j_byte>>4])
		j_buf = append(j_buf, yu_const.HexUpper[j_byte&0x0f])
	}
	return string(j_buf)
}

const _reverseHexTable = "" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xff\xff\xff\xff\xff\xff" +
	"\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +
	"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"

func Decode(s string) []byte {
	if s == "" || len(s)%2 == 1 {
		return nil
	}
	j_buf := make([]byte, 0, len(s)/2)
	for j_i := 0; j_i < len(s); j_i += 2 {
		j_left := _reverseHexTable[s[j_i]]
		j_right := _reverseHexTable[s[j_i+1]]
		if j_left > 0x0f || j_right > 0x0f {
			return nil
		}
		j_buf = append(j_buf, (j_left<<4)|j_right)
	}
	return j_buf
}
