• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

golang 环境数据212协议解析

互联网 diligentman 2周前 (04-08) 9次浏览

单元测试方法

package server

import (
	"bytes"
	"github.com/liqiongtao/goo"
	"log"
	"strconv"
	"testing"
)

func Test_message2dbV2(t *testing.T) {
	buf := []byte("##0331QN=20210408192740056;ST=22;CN=2011;PW=123456;MN=0507A010000330_1;Flag=5;CP=u0026u0026DataTime=20210408192740;a01001-Rtd=14,a01001-Flag=N;a01002-Rtd=37.2,a01002-Flag=N;a01006-Rtd=97.94,a01006-Flag=N;a01007-Rtd=0,a01007-Flag=N;a01008-Rtd=297,a01008-Flag=N;a34001-Rtd=53,a34001-Flag=N;a34002-Rtd=62,a34002-Flag=N;a34004-Rtd=39,a34004-Flag=Nu0026u002671C0rn")

	// 判断数据是否##开头
	if !bytes.Equal(buf[:2], []byte("##")) {
		goo.Log.WithField("message", string(buf)).Error("报文格式不正确")
		return
	}

	// 替换转义字符
	buf = bytes.ReplaceAll(buf, []byte("u0026"), []byte("&"))

	var (
		dl  int
		err error
	)

	// 获取协议数据长度
	dl, err = strconv.Atoi(string(buf[2:6]))
	if err != nil {
		goo.Log.WithField("message", string(buf)).Error(err.Error())
		return
	}
	if l := len(buf); dl > l+6 {
		return
	}

	var (
		dtBuf = buf[6 : dl+6]
		index int
		data  = map[string]string{}
	)

	// 转换数据到map
	for _, i := range bytes.Split(dtBuf, []byte("&&")) {
		for _, j := range bytes.Split(i, []byte(";")) {
			if string(j) == "" {
				continue
			}
			for _, bf := range bytes.Split(j, []byte(",")) {
				if string(bf) == "" {
					continue
				}
				index = bytes.Index(bf, []byte("="))
				if index == -1 {
					continue
				}
				data[string(bf[:index])] = string(bf[index+1:])
			}
		}
	}

	for k, v := range data {
		log.Println(k, "=", v)
	}
}

展开阅读全文

github

© 著作权归作者所有

举报

打赏

0


0 收藏

微信
QQ
微博

分享

作者的其它热门文章

ubuntu14.04 部署atlas
nodejs链接kafka示例(producer、consumer)
centos删除docker0虚拟网卡
golang 第三方插件汇总


程序员灯塔
转载请注明原文链接:golang 环境数据212协议解析
喜欢 (0)