Пример #1
0
// not crazy about this
func capitalize(sentence []byte) []byte {
	l := len(sentence)
	l1 := l - 1
	for i := 0; i < l1; i++ {
		if sentence[i] == ' ' && sentence[i+1] != ' ' {
			sentence[i+1] = bytes.ToUpper(sentence[i+1 : i+2])[0]
		}
	}
	if sentence[0] != ' ' {
		sentence[0] = bytes.ToUpper(sentence[0:1])[0]
	}
	return sentence
}
Пример #2
0
func upperFirst(s string) string {
	if s == "" {
		return ""
	}

	return string(bytes.ToUpper([]byte(s[0:1]))) + s[1:]
}
Пример #3
0
func ParseMessage(line []byte) *Message {
	line = bytes.TrimSpace(line)
	if len(line) <= 0 {
		return nil
	}
	m := new(Message)
	if line[0] == ':' {
		split := bytes.SplitN(line, []byte{' '}, 2)
		if len(split) <= 1 {
			return nil
		}
		m.Prefix = string(split[0][1:])
		line = split[1]
	}
	split := bytes.SplitN(line, []byte{':'}, 2)
	args := bytes.Split(bytes.TrimSpace(split[0]), []byte{' '})
	m.Command = string(bytes.ToUpper(args[0]))
	m.Args = make([]string, 0, len(args))
	for _, arg := range args[1:] {
		m.Args = append(m.Args, string(arg))
	}
	if len(split) > 1 {
		m.Args = append(m.Args, string(split[1]))
	}
	return m
}
Пример #4
0
// 对 parameters 里的参数做 MD5 签名.
// 签名方法:
// 1. 对参数 parameters 按照 key 的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的
// 格式(即 key1=value1&key2=value2...)拼接成字符串 string1,
// 注意:值为空的参数不参与签名;
// 2. 在 string1 最后拼接上 key=Key(商户支付密钥) 得到 stringSignTemp 字符串, 并对
// stringSignTemp 进行 md5 运算,再将得到的字符串所有字符转换为大写,得到 sign 值
// signValue。
//
//  parameters:  待签名的参数
//  Key:         支付签名的 Key
func MD5Signature(parameters map[string]string, Key string) (signature string) {
	keys := make([]string, 0, len(parameters))
	for key, value := range parameters {
		if value == "" { // 值为空不参加签名
			continue
		}
		if key == "sign" {
			continue
		}

		keys = append(keys, key)
	}
	sort.Strings(keys)

	Hash := md5.New()
	hashsum := make([]byte, md5.Size*2)

	for _, key := range keys {
		value := parameters[key]

		Hash.Write([]byte(key))
		Hash.Write([]byte{'='})
		Hash.Write([]byte(value))
		Hash.Write([]byte{'&'})
	}
	Hash.Write([]byte("key="))
	Hash.Write([]byte(Key))

	hex.Encode(hashsum, Hash.Sum(nil))
	signature = string(bytes.ToUpper(hashsum))
	return
}
Пример #5
0
func (mg MapGen) Generate() error {
	filename := filepath.Join(mg.path, strings.ToLower(mg.typeName)+"-mapping.go")
	if _, err := os.Stat(filename); err == nil {
		os.Remove(filename)
	}

	data := mapGenTplData{
		PackageName: mg.packageName,
		TypeName:    mg.typeName,
		Targets:     make(map[string]string),
	}
	removeSpecialCharsRegex := regexp.MustCompile("[^a-zA-Z0-9]+")
	for _, targetType := range mg.targets {
		typeName := targetType

		typeNameBytes := []byte(typeName)

		typeNameBytes = removeSpecialCharsRegex.ReplaceAll(typeNameBytes, []byte(""))

		// set the first character to uppercase
		typeNameBytes[0] = bytes.ToUpper(typeNameBytes[0:1])[0]
		typeName = string(typeNameBytes)

		data.Targets[targetType] = typeName
	}

	file, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0777)
	if err != nil {
		return err
	}
	err = mapGenTpl.Execute(file, data)

	return err
}
Пример #6
0
func ExampleWordDecoder_Decode() {
	dec := new(WordDecoder)
	header, err := dec.Decode("=?utf-8?q?=C2=A1Hola,_se=C3=B1or!?=")
	if err != nil {
		panic(err)
	}
	fmt.Println(header)

	dec.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) {
		switch charset {
		case "x-case":
			// Fake character set for example.
			// Real use would integrate with packages such
			// as code.google.com/p/go-charset
			content, err := ioutil.ReadAll(input)
			if err != nil {
				return nil, err
			}
			return bytes.NewReader(bytes.ToUpper(content)), nil
		}
		return nil, fmt.Errorf("unhandled charset %q", charset)
	}
	header, err = dec.Decode("=?x-case?q?hello!?=")
	if err != nil {
		panic(err)
	}
	fmt.Println(header)
	// Output:
	// ¡Hola, señor!
	// HELLO!
}
Пример #7
0
// 传统的签名代码, Sign 是优化后的代码, 要提高 35% 的速度
func Sign2(parameters map[string]string, apiKey string, fn func() hash.Hash) string {
	ks := make([]string, 0, len(parameters))
	for k := range parameters {
		if k == "sign" {
			continue
		}
		ks = append(ks, k)
	}
	sort.Strings(ks)

	if fn == nil {
		fn = md5.New
	}
	h := fn()
	signature := make([]byte, h.Size()*2)

	for _, k := range ks {
		v := parameters[k]
		if v == "" {
			continue
		}
		h.Write([]byte(k))
		h.Write([]byte{'='})
		h.Write([]byte(v))
		h.Write([]byte{'&'})
	}
	h.Write([]byte("key="))
	h.Write([]byte(apiKey))

	hex.Encode(signature, h.Sum(nil))
	return string(bytes.ToUpper(signature))
}
Пример #8
0
func (v *vimDoc) Header(out *bytes.Buffer, text func() bool, level int, id string) {
	initPos := out.Len()
	if v.flags&flagNoRules == 0 {
		switch level {
		case 1:
			v.writeRule(out, "=")
		case 2:
			v.writeRule(out, "-")
		}
	}

	headingPos := out.Len()
	if !text() {
		out.Truncate(initPos)
		return
	}

	var temp []byte
	temp = append(temp, out.Bytes()[headingPos:]...)
	out.Truncate(headingPos)

	h := &heading{temp, level}
	v.headings = append(v.headings, h)

	tag := fmt.Sprintf("*%s*", v.buildHelpTag(h.text))
	v.writeSplitText(out, bytes.ToUpper(h.text), []byte(tag), " ", 2)
	out.WriteString("\n")
}
Пример #9
0
func main() {
	quickBrownFox := []byte("The quick brown fox jumped over the lazy dog")

	title := bytes.Title(quickBrownFox)
	log.Printf("Title turned %q into %q", quickBrownFox, title)

	allTitle := bytes.ToTitle(quickBrownFox)
	log.Printf("ToTitle turned %q to %q", quickBrownFox, allTitle)

	allTitleTurkish := bytes.ToTitleSpecial(unicode.TurkishCase, quickBrownFox)
	log.Printf("ToTitleSpecial turned %q into %q using the Turkish case rules", quickBrownFox, allTitleTurkish)

	lower := bytes.ToLower(title)
	log.Printf("ToLower turned %q into %q", title, lower)

	turkishCapitalI := []byte("İ")
	turkishLowerI := bytes.ToLowerSpecial(unicode.TurkishCase, turkishCapitalI)
	log.Printf("ToLowerSpecial turned %q into %q using the Turkish case rules", turkishCapitalI, turkishLowerI)

	upper := bytes.ToUpper(quickBrownFox)
	log.Printf("ToUpper turned %q to %q", quickBrownFox, upper)

	upperSpecial := bytes.ToUpperSpecial(unicode.TurkishCase, quickBrownFox)
	log.Printf("ToUpperSpecial turned %q into %q using the Turkish case rules", quickBrownFox, upperSpecial)
}
Пример #10
0
// jssdk 支付签名, signType 只支持 "MD5", "SHA1", 传入其他的值会 panic.
func JsapiSign(appId, timeStamp, nonceStr, packageStr, signType string, apiKey string) string {
	var h hash.Hash
	switch signType {
	case "MD5":
		h = md5.New()
	case "SHA1":
		h = sha1.New()
	default:
		panic("unsupported signType")
	}
	bufw := bufio.NewWriterSize(h, 128)

	// appId
	// nonceStr
	// package
	// signType
	// timeStamp
	bufw.WriteString("appId=")
	bufw.WriteString(appId)
	bufw.WriteString("&nonceStr=")
	bufw.WriteString(nonceStr)
	bufw.WriteString("&package=")
	bufw.WriteString(packageStr)
	bufw.WriteString("&signType=")
	bufw.WriteString(signType)
	bufw.WriteString("&timeStamp=")
	bufw.WriteString(timeStamp)
	bufw.WriteString("&key=")
	bufw.WriteString(apiKey)

	bufw.Flush()
	signature := make([]byte, hex.EncodedLen(h.Size()))
	hex.Encode(signature, h.Sum(nil))
	return string(bytes.ToUpper(signature))
}
Пример #11
0
// Sign 微信支付签名.
//  params: 待签名的参数集合
//  apiKey: api密钥
//  fn:     func() hash.Hash, 如果为 nil 则默认用 md5.New
func Sign(params map[string]string, apiKey string, fn func() hash.Hash) string {
	if fn == nil {
		fn = md5.New
	}
	h := fn()
	bufw := bufio.NewWriterSize(h, 128)

	keys := make([]string, 0, len(params))
	for k := range params {
		if k == "sign" {
			continue
		}
		keys = append(keys, k)
	}
	sort.Strings(keys)

	for _, k := range keys {
		v := params[k]
		if v == "" {
			continue
		}
		bufw.WriteString(k)
		bufw.WriteByte('=')
		bufw.WriteString(v)
		bufw.WriteByte('&')
	}
	bufw.WriteString("key=")
	bufw.WriteString(apiKey)

	bufw.Flush()
	signature := make([]byte, hex.EncodedLen(h.Size()))
	hex.Encode(signature, h.Sum(nil))
	return string(bytes.ToUpper(signature))
}
Пример #12
0
func (this *Parser) MatchExpectedIgnoreCase(value int, expected byte) bool {
	var lowers [2]byte
	lowers[0] = byte(value)
	lowers[1] = expected
	uppers := bytes.ToUpper(lowers[:])
	return uppers[0] == uppers[1] //Character.toUpperCase(value) == Character.toUpperCase(expected);
}
Пример #13
0
func Top(w http.ResponseWriter, r *http.Request) {
	method := bytes.ToUpper([]byte(r.Method))
	if string(method) != "POST" {
		http.Error(w, string(method)+" is not allowed", 403)
	} else {
		fmt.Fprintln(w, r.Method+" is ok")
	}
}
Пример #14
0
func (redis *Redis) newTransaction(requ, resp *redisMessage) common.MapStr {
	error := common.OK_STATUS
	if resp.IsError {
		error = common.ERROR_STATUS
	}

	var returnValue map[string]common.NetString
	if resp.IsError {
		returnValue = map[string]common.NetString{
			"error": resp.Message,
		}
	} else {
		returnValue = map[string]common.NetString{
			"return_value": resp.Message,
		}
	}

	src := &common.Endpoint{
		Ip:   requ.TcpTuple.Src_ip.String(),
		Port: requ.TcpTuple.Src_port,
		Proc: string(requ.CmdlineTuple.Src),
	}
	dst := &common.Endpoint{
		Ip:   requ.TcpTuple.Dst_ip.String(),
		Port: requ.TcpTuple.Dst_port,
		Proc: string(requ.CmdlineTuple.Dst),
	}
	if requ.Direction == tcp.TcpDirectionReverse {
		src, dst = dst, src
	}

	// resp_time in milliseconds
	responseTime := int32(resp.Ts.Sub(requ.Ts).Nanoseconds() / 1e6)

	event := common.MapStr{
		"@timestamp":   common.Time(requ.Ts),
		"type":         "redis",
		"status":       error,
		"responsetime": responseTime,
		"redis":        returnValue,
		"method":       common.NetString(bytes.ToUpper(requ.Method)),
		"resource":     requ.Path,
		"query":        requ.Message,
		"bytes_in":     uint64(requ.Size),
		"bytes_out":    uint64(resp.Size),
		"src":          src,
		"dst":          dst,
	}
	if redis.SendRequest {
		event["request"] = requ.Message
	}
	if redis.SendResponse {
		event["response"] = resp.Message
	}

	return event
}
Пример #15
0
// convert an input string to uppercase
func Upcase(input interface{}, data map[string]interface{}) interface{} {
	switch typed := input.(type) {
	case []byte:
		return bytes.ToUpper(typed)
	case string:
		return strings.ToUpper(typed)
	default:
		return input
	}
}
Пример #16
0
func (g *Generator) ToUpper(char []byte) byte {
	var b byte
	rand.Seed(time.Now().UTC().UnixNano())
	n := rand.Intn(g.CapitalizeOdds)
	if n == g.CapitalizeOdds-1 {
		b = bytes.ToUpper(char)[0]
	} else {
		b = char[0]
	}
	return b
}
Пример #17
0
// 设置签名字段.
//  appKey: 商户支付密钥Key
//
//  NOTE: 要求在 JSAPIPayRequestParameters 其他字段设置完毕后才能调用这个函数, 否则签名就不正确.
func (para *JSAPIPayRequestParameters) SetSignature(appKey string) (err error) {
	var Hash hash.Hash
	var hashsum []byte

	switch para.SignMethod {
	case "md5", "MD5":
		Hash = md5.New()
		hashsum = make([]byte, md5.Size*2)

	default:
		err = fmt.Errorf(`unknown sign method: %q`, para.SignMethod)
		return
	}

	// 字典序
	// appId
	// nonceStr
	// package
	// signType
	// timeStamp
	if len(para.AppId) > 0 {
		Hash.Write([]byte("appId="))
		Hash.Write([]byte(para.AppId))
		Hash.Write([]byte{'&'})
	}
	if len(para.NonceStr) > 0 {
		Hash.Write([]byte("nonceStr="))
		Hash.Write([]byte(para.NonceStr))
		Hash.Write([]byte{'&'})
	}
	if len(para.Package) > 0 {
		Hash.Write([]byte("package="))
		Hash.Write([]byte(para.Package))
		Hash.Write([]byte{'&'})
	}
	if len(para.SignMethod) > 0 {
		Hash.Write([]byte("signType="))
		Hash.Write([]byte(para.SignMethod))
		Hash.Write([]byte{'&'})
	}
	if len(para.TimeStamp) > 0 {
		Hash.Write([]byte("timeStamp="))
		Hash.Write([]byte(para.TimeStamp))
		Hash.Write([]byte{'&'})
	}
	Hash.Write([]byte("key="))
	Hash.Write([]byte(appKey))

	hex.Encode(hashsum, Hash.Sum(nil))
	hashsum = bytes.ToUpper(hashsum)

	para.Signature = string(hashsum)
	return
}
Пример #18
0
func sanitiseSecret(in []byte) []byte {
	in = bytes.ToUpper(in)
	in = bytes.Replace(in, []byte(" "), []byte(""), -1)
	if len(in)%8 != 0 {
		padding := 8 - (len(in) % 8)
		for i := 0; i < padding; i++ {
			in = append(in, '=')
		}
	}
	return in
}
Пример #19
0
func readRefSeq(fnaFile string) map[string][]byte {
	f := openFile(fnaFile)
	fastaReader := seq.NewFastaReader(f)
	fastaReader.DeflineParser = func(s string) string { return strings.Split(strings.TrimSpace(s), " ")[0] }
	m := make(map[string][]byte)
	sequences, err := fastaReader.ReadAll()
	raiseError(err)
	for _, s := range sequences {
		m[s.Id] = bytes.ToUpper(s.Seq)
	}
	return m
}
Пример #20
0
func confirm(prompt string) (bool, error) {
	fmt.Printf("%s (y/N): ", prompt)
	bio := bufio.NewReader(os.Stdin)
	line, _, err := bio.ReadLine()
	if err != nil {
		return false, err
	}
	if len(line) > 0 && bytes.ToUpper(line)[0] == 'Y' {
		return true, nil
	}
	return false, nil
}
Пример #21
0
func (tkn *Tokenizer) scanIdentifier() (int, []byte) {
	buffer := bytes.NewBuffer(make([]byte, 0, 8))
	buffer.WriteByte(byte(tkn.lastChar))
	for tkn.next(); isLetter(tkn.lastChar) || isDigit(tkn.lastChar); tkn.next() {
		buffer.WriteByte(byte(tkn.lastChar))
	}
	uppered := bytes.ToUpper(buffer.Bytes())
	if keywordID, found := keywords[string(uppered)]; found {
		return keywordID, uppered
	}
	return tokID, buffer.Bytes()
}
Пример #22
0
//向迁移函数添加一个映射,给定下一个状态节点
//假定我们的上下文无关文法是大小写不敏感的,当输入字符是char类型并且是字母时,
//生成大写字母和小写字母两个映射
func (this *NFAState) AddTransitByte2(input byte, next *NFAState) *NFAState {
	if input >= 'a' && input <= 'z' && input >= 'A' && input <= 'Z' {
		var b [1]byte
		b[0] = input
		this.AddTransitInt2(int(bytes.ToUpper(b[:])[0]), next)
		this.AddTransitInt2(int(bytes.ToLower(b[:])[0]), next)
		return next
	} else {
		this.AddTransitInt2(int(input), next)
		return next
	}
}
Пример #23
0
func MakeFirstUpperCase(s string) string {

	if len(s) < 2 {
		return strings.ToLower(s)
	}

	bts := []byte(s)

	lc := bytes.ToUpper([]byte{bts[0]})
	rest := bts[1:]

	return string(bytes.Join([][]byte{lc, rest}, nil))
}
Пример #24
0
// 生成 native 支付 静态链接 URL.
//  AppId:      必须, 微信分配的公众账号ID
//  AppKey:     必须, 即 paySignKey, 公众号支付请求中用于加密的密钥 Key
//  NonceStr:   必须, 32个字符以内, 商户生成的随机字符串
//  Timestamp:  必须, unixtime, 商户生成
//  ProductId:  必须, 32个字符以内, 商户需要定义并维护自己的商品id,这个id 与一张订单等价,
//                   微信后台凭借该id 通过POST 商户后台获取交易必须信息;传此参数必须在
//                   申请的时候配置了Package 请求回调地址;
//  MerchantId: 必须, 微信支付分配的商户号
//
//  NOTE: 该函数没有做 url escape, 因为正常情况下根本不需要做 url escape
func NativeURL(AppId, AppKey, NonceStr, Timestamp, ProductId, MerchantId string) string {
	Hash := md5.New()
	hashsum := make([]byte, md5.Size*2)

	// 字典序
	// appid
	// mch_id
	// nonce_str
	// product_id
	// time_stamp
	if len(AppId) > 0 {
		Hash.Write([]byte("appid="))
		Hash.Write([]byte(AppId))
		Hash.Write([]byte{'&'})
	}
	if len(MerchantId) > 0 {
		Hash.Write([]byte("mch_id="))
		Hash.Write([]byte(MerchantId))
		Hash.Write([]byte{'&'})
	}
	if len(NonceStr) > 0 {
		Hash.Write([]byte("nonce_str="))
		Hash.Write([]byte(NonceStr))
		Hash.Write([]byte{'&'})
	}
	if len(ProductId) > 0 {
		Hash.Write([]byte("product_id="))
		Hash.Write([]byte(ProductId))
		Hash.Write([]byte{'&'})
	}
	if len(Timestamp) > 0 {
		Hash.Write([]byte("time_stamp="))
		Hash.Write([]byte(Timestamp))
		Hash.Write([]byte{'&'})
	}
	Hash.Write([]byte("key="))
	Hash.Write([]byte(AppKey))

	hex.Encode(hashsum, Hash.Sum(nil))
	hashsum = bytes.ToUpper(hashsum)

	// weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX
	//          &product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
	return "weixin://wxpay/bizpayurl?sign=" + string(hashsum) +
		"&appid=" + AppId +
		"&mch_id=" + MerchantId +
		"&product_id=" + ProductId +
		"&time_stamp=" + Timestamp +
		"&nonce_str=" + NonceStr
}
Пример #25
0
func (d *DiversityFilter) findGenome(r *sam.Record, env *lmdb.Env, dbname string) (val []byte, err error) {
	fn := func(txn *lmdb.Txn) error {
		dbi, err := txn.OpenDBI(dbname, 0)
		if err != nil {
			return err
		}
		key := []byte(r.Ref.Name())
		val, err = txn.Get(dbi, key)
		val = bytes.ToUpper(val)
		return err
	}
	err = env.View(fn)
	return
}
Пример #26
0
func (p *SuccessPacket) Encode() (b []byte) {
	len := 4 + 2 + 40 + 3 + len(p.Message)
	b = make([]byte, len)
	b[0] = byte(p.OpCode())
	b[1] = byte(p.Identifier)
	binary.BigEndian.PutUint16(b[2:4], uint16(len))
	copy(b[4:6], "S=")
	hex.Encode(b[6:46], p.Auth[:])
	out := bytes.ToUpper(b[6:46])
	copy(b[6:46], out)
	copy(b[46:49], " M=")
	copy(b[49:], p.Message)
	return b
}
Пример #27
0
func transformRegExp(ecmaRegExp string) (goRegExp string) {
	// https://bugzilla.mozilla.org/show_bug.cgi/show_bug.cgi?id=334158
	tmp := []byte(ecmaRegExp)
	for _, value := range transformRegExp_unescape {
		tmp = value.ReplaceAll(tmp, []byte(`$1$2`))
	}
	tmp = transformRegExp_escape_c.ReplaceAllFunc(tmp, func(in []byte) []byte {
		in = bytes.ToUpper(in)
		return []byte(fmt.Sprintf("\\%o", in[0]-64)) // \cA => \001 (A == 65)
	})
	tmp = transformRegExp_unescape_c.ReplaceAll(tmp, []byte(`c`))
	tmp = transformRegExp_unescapeDollar.ReplaceAll(tmp, []byte(`$1`))
	tmp = transformRegExp_matchSlashU.ReplaceAll(tmp, []byte(`\x{$1}`))
	return string(tmp)
}
Пример #28
0
// 创建订单查询的 package 数据
func MakeOrderQueryRequestPackage(
	OutTradeNo string, // 第三方唯一订单号
	PartnerId string, // 财付通商户身份标识
	PartnerKey string, // 财付通商户权限密钥

) string {

	// 签名的源
	const keysLen1 = len(`out_trade_no=&partner=&key=`)
	n1 := keysLen1 + len(OutTradeNo) + len(PartnerId) + len(PartnerKey)

	// 最终结果
	const keysLen2 = len(`out_trade_no=&partner=&sign=`)
	n2 := keysLen2 + len(OutTradeNo) + len(PartnerId) + 32 // md5sum

	var n int
	if n1 >= n2 {
		n = n1
	} else {
		n = n2
	}
	buf := make([]byte, n)

	string1 := buf[:0]

	// 字典序
	// out_trade_no
	// partner
	string1 = append(string1, "out_trade_no="...)
	string1 = append(string1, OutTradeNo...)
	string1 = append(string1, "&partner="...)
	string1 = append(string1, PartnerId...)

	string2 := string1 // 到目前为止两者相同

	string1 = append(string1, "&key="...)
	string1 = append(string1, PartnerKey...)

	hashSumArray := md5.Sum(string1)

	string2 = append(string2, "&sign="...)
	signature := buf[len(string2) : len(string2)+32]
	hex.Encode(signature, hashSumArray[:])
	string2 = append(string2, bytes.ToUpper(signature)...)

	return string(string2)
}
Пример #29
0
// Obtain the sequence of a read mapping to the reference genome.
// Return the mapped sequence.
func map2Ref(r *sam.Record) []byte {
	s := []byte{}
	p := 0                                // position in the read sequence.
	read := bytes.ToUpper(r.Seq.Expand()) // read sequence.
	for _, c := range r.Cigar {
		switch c.Type() {
		case sam.CigarMatch, sam.CigarMismatch, sam.CigarEqual:
			s = append(s, read[p:p+c.Len()]...)
			p += c.Len()
		case sam.CigarInsertion, sam.CigarSoftClipped, sam.CigarHardClipped:
			p += c.Len()
		case sam.CigarDeletion, sam.CigarSkipped:
			s = append(s, bytes.Repeat([]byte{'*'}, c.Len())...)
		}
	}

	return s
}
Пример #30
0
/*BaseContent returns base content for given bases. For example:

  seq.BaseContent("gc")

*/
func (seq *Seq) BaseContent(list string) float64 {
	if len(seq.Seq) == 0 {
		return float64(0)
	}

	sum := 0
	for _, b := range []byte(list) {
		up := bytes.ToUpper([]byte{b})
		lo := bytes.ToLower([]byte{b})
		if string(up) == string(lo) {
			sum += bytes.Count(seq.Seq, up)
		} else {
			sum += bytes.Count(seq.Seq, up) + bytes.Count(seq.Seq, lo)
		}
	}

	return float64(sum) / float64(len(seq.Seq))
}