feiyu02
2024-01-26 01eae19a4870033e879a3faa6749eece92926cab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.flightfeather.uav.socket.bean
 
import java.text.SimpleDateFormat
import java.util.*
 
/**
 * @author riku
 * Date: 2020/9/10
 */
open class BaseMessage {
 
    var head: String = ""
    var length: String = ""
 
    var qn: String = ""
    var st: String = ""
    var cn: String = ""
    var pw: String = ""
    var mn: String = ""
    var flag: String = ""
    var cp: String = ""
    var extra: String = ""
 
    var crc: String = ""
 
    open fun newMessage() {
        head = "##"
        qn = SimpleDateFormat("yyyyMMddHHmmssSSS", Locale.getDefault()).format(Date())
    }
 
    fun parse2Str():String {
        val str = "QN=$qn;ST=$st;CN=$cn;PW=$pw;MN=$mn;Flag=$flag;CP=&&${cp}&&$extra"
        return "$head${getLength(str.length)}$str${getCrc(str.toByteArray(), str.length)}\r\n"
    }
 
    /**
     * crc计算工具类
     * @param bufData 数据段字符串转化的byte[],
     * @param bufLen 的长度
     * @return CRC码:4字节
     */
    fun getCrc(bufData: ByteArray, bufLen: Int): String? {
        var crc = 0x0000ffff
        val polynomial = 0x0000a001
        var j: Int
        if (bufLen == 0) {
            return null
        }
        var i: Int = 0
        while (i < bufLen) {
            crc = crc xor (bufData[i].toInt() and 0x000000ff)
            j = 0
            while (j < 8) {
                if (crc and 0x00000001 != 0) {
                    crc = crc shr 1
                    crc = crc xor polynomial
                } else {
                    crc = crc shr 1
                }
                j++
            }
            i++
        }
        var strCRC = Integer.toHexString(crc).toString()
        if (strCRC.length < 4) {
            strCRC += "0"
        }
        return strCRC
    }
 
    fun getLength(length: Int): String {
        val size = StringBuilder()
        when {
            length >= 100 -> {
                size.append("0")
            }
            length >= 10 -> {
                size.append("00")
            }
            length >= 0 -> {
                size.append("000")
            }
        }
        size.append(length)
        return size.toString()
    }
}