func ctcpPack(tag []byte, data []byte) []byte {
	if len(data) == 0 {
		return tag
	}
	ret := make([]byte, len(tag)+len(data)+1)
	copy(ret, tag)
	ret[len(tag)] = ctcpSep
	copy(ret[len(tag)+1:], data)
	return ret
}
ctcpPack packs tagging data in with the message data.
package irc
import "bytes"
const (
	ctcpDelim     = '\x01'
	ctcpLowQuote  = '\x10'
	ctcpHighQuote = '\x5C'
	ctcpSep       = '\x20'
)
func IsCTCP(msg []byte) bool {
	return ctcpDelim == msg[0] && ctcpDelim == msg[len(msg)-1]
}
func IsCTCPString(msg string) bool {
	return ctcpDelim == msg[0] && ctcpDelim == msg[len(msg)-1]
}
func CTCPunpack(msg []byte) (tag []byte, data []byte) {
	msg = msg[1 : len(msg)-1]
	msg = ctcpLowLevelUnescape(msg)
	tag, data = ctcpUnpack(msg)
	tag = ctcpHighLevelUnescape(tag)
	if data != nil {
		data = ctcpHighLevelUnescape(data)
	}
	return tag, data
}
func CTCPpack(tag, data []byte) []byte {
	if data != nil {
		data = ctcpHighLevelEscape(data)
	}
	tag = ctcpHighLevelEscape(tag)
	ret := ctcpPack(tag, data)
	ret = ctcpLowLevelEscape(ret)
	retDelimited := make([]byte, len(ret)+2)
	retDelimited[0] = ctcpDelim
	retDelimited[len(retDelimited)-1] = ctcpDelim
	copy(retDelimited[1:], ret)
	return retDelimited
}
func CTCPunpackString(msg string) (tag, data string) {
	t, d := CTCPunpack([]byte(msg))
	return string(t), string(d)
}
func CTCPpackString(tag, data string) string {
	ret := CTCPpack([]byte(tag), []byte(data))
	return string(ret)
}
func ctcpUnpack(in []byte) ([]byte, []byte) {
	splits := bytes.SplitN(in, []byte{ctcpSep}, 2)
	if len(splits) == 2 {
		return splits[0], splits[1]
	}
	return splits[0], nil
}