284 lines
5.5 KiB
Go
284 lines
5.5 KiB
Go
|
package message
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
)
|
|||
|
|
|||
|
func aa(src []byte, dest []byte) uint16 {
|
|||
|
var (
|
|||
|
SrcPos, TgtPos, Pos1, Pos2, iii, Gap uint16
|
|||
|
Got1stFF uint8
|
|||
|
)
|
|||
|
srouceLen := uint16(len(src))
|
|||
|
for SrcPos = 0; SrcPos < srouceLen; SrcPos++ {
|
|||
|
if Got1stFF == 1 {
|
|||
|
if src[SrcPos] == 0xff {
|
|||
|
//Got2ndFF = 1
|
|||
|
Pos2 = SrcPos
|
|||
|
dest[TgtPos] = byte(Pos2 - Pos1)
|
|||
|
TgtPos++
|
|||
|
|
|||
|
for iii = Pos1 + 1; iii < Pos2; iii++ {
|
|||
|
dest[TgtPos] = src[iii]
|
|||
|
TgtPos++
|
|||
|
}
|
|||
|
Got1stFF = 0
|
|||
|
//Got2ndFF = 0
|
|||
|
Pos1 = 0
|
|||
|
Pos2 = 0
|
|||
|
Gap = 0
|
|||
|
} else {
|
|||
|
/*已遇到前一个FF,且当前遇到非FF*/
|
|||
|
Gap++
|
|||
|
if 252 == Gap {
|
|||
|
Got1stFF = 0
|
|||
|
Gap = 0
|
|||
|
dest[TgtPos] = 0
|
|||
|
TgtPos++
|
|||
|
for iii = Pos1 + 1; iii <= SrcPos; iii++ {
|
|||
|
dest[TgtPos] = src[iii]
|
|||
|
TgtPos++
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
/*尚未遇到前一个FF*/
|
|||
|
dest[TgtPos] = src[SrcPos]
|
|||
|
TgtPos++
|
|||
|
if 0xFF == src[SrcPos] {
|
|||
|
/*遇到前一个FF*/
|
|||
|
Got1stFF = 1
|
|||
|
Pos1 = SrcPos
|
|||
|
Gap = 0
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if 1 == Got1stFF {
|
|||
|
dest[TgtPos] = 0
|
|||
|
TgtPos++
|
|||
|
for iii = Pos1 + 1; iii < srouceLen; iii++ {
|
|||
|
dest[TgtPos] = src[iii]
|
|||
|
TgtPos++
|
|||
|
}
|
|||
|
}
|
|||
|
return TgtPos
|
|||
|
}
|
|||
|
|
|||
|
func TranslateFromFFFE(pSrc []byte) ([]byte, uint16) {
|
|||
|
var (
|
|||
|
srcPos, tgtPos, nonFFCount, nextFFPos uint16
|
|||
|
char uint8
|
|||
|
state int
|
|||
|
)
|
|||
|
|
|||
|
if len(pSrc) == 0 {
|
|||
|
return nil, 0 // 入参错误
|
|||
|
}
|
|||
|
|
|||
|
pTgt := make([]byte, len(pSrc)) // 预分配与输入等长的缓冲区
|
|||
|
tgtPos = 0
|
|||
|
state = WAIT_FF_C1
|
|||
|
nonFFCount = 0
|
|||
|
|
|||
|
for srcPos = 0; srcPos < uint16(len(pSrc)); srcPos++ {
|
|||
|
char = pSrc[srcPos]
|
|||
|
switch state {
|
|||
|
case WAIT_FF_C1:
|
|||
|
if char == 0xFF {
|
|||
|
pTgt[tgtPos] = char
|
|||
|
tgtPos++
|
|||
|
state = WAIT_FF_C2
|
|||
|
} else {
|
|||
|
pTgt[tgtPos] = char
|
|||
|
tgtPos++
|
|||
|
}
|
|||
|
case WAIT_FF_C2:
|
|||
|
if char == 0xFD || char == 0xFE || char == 0xFF {
|
|||
|
state = ABNORMAL_STATE
|
|||
|
} else {
|
|||
|
if char == 0 {
|
|||
|
state = WAIT_NO_FF
|
|||
|
} else if char == 1 {
|
|||
|
pTgt[tgtPos] = 0xFF
|
|||
|
tgtPos++
|
|||
|
state = WAIT_FF_C1
|
|||
|
} else {
|
|||
|
nextFFPos = srcPos + uint16(char) - 1
|
|||
|
state = WAIT_FF_POS
|
|||
|
}
|
|||
|
}
|
|||
|
case WAIT_NO_FF:
|
|||
|
nonFFCount++
|
|||
|
if char == 0xFF && nonFFCount < 252 {
|
|||
|
state = ABNORMAL_STATE
|
|||
|
} else {
|
|||
|
pTgt[tgtPos] = char
|
|||
|
tgtPos++
|
|||
|
if nonFFCount == 252 {
|
|||
|
nonFFCount = 0
|
|||
|
state = WAIT_FF_C1
|
|||
|
}
|
|||
|
}
|
|||
|
case WAIT_FF_POS:
|
|||
|
if char == 0xFF {
|
|||
|
state = ABNORMAL_STATE
|
|||
|
} else {
|
|||
|
pTgt[tgtPos] = char
|
|||
|
tgtPos++
|
|||
|
if srcPos == nextFFPos {
|
|||
|
pTgt[tgtPos] = 0xFF
|
|||
|
tgtPos++
|
|||
|
state = WAIT_FF_C1
|
|||
|
}
|
|||
|
}
|
|||
|
default:
|
|||
|
state = ABNORMAL_STATE
|
|||
|
}
|
|||
|
|
|||
|
if state == ABNORMAL_STATE {
|
|||
|
tgtPos = 0
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 退出时的状态判断
|
|||
|
if state == WAIT_FF_C2 || state == WAIT_FF_POS {
|
|||
|
tgtPos = 0
|
|||
|
}
|
|||
|
|
|||
|
return pTgt[:tgtPos], tgtPos
|
|||
|
}
|
|||
|
|
|||
|
// TranslateToFFFE 对给定的字节切片进行FFFE转义处理
|
|||
|
func TranslateToFFFE(src []byte) ([]byte, error) {
|
|||
|
if src == nil {
|
|||
|
return nil, fmt.Errorf("source data is nil")
|
|||
|
}
|
|||
|
var tgt []byte
|
|||
|
var pos1, pos2 int
|
|||
|
var gap int
|
|||
|
var got1stFF bool
|
|||
|
|
|||
|
for i, b := range src {
|
|||
|
if got1stFF {
|
|||
|
if b == 0xFF {
|
|||
|
// 已遇到前一个FF,且当前又遇到FF
|
|||
|
got1stFF = false
|
|||
|
pos2 = i
|
|||
|
if gap > 252 {
|
|||
|
// 间隙过大,特殊处理
|
|||
|
tgt = append(tgt, 0)
|
|||
|
tgt = append(tgt, src[pos1+1:pos2]...)
|
|||
|
} else {
|
|||
|
// 写入间隙长度
|
|||
|
tgt = append(tgt, byte(gap))
|
|||
|
// 写入间隙中的字节
|
|||
|
tgt = append(tgt, src[pos1+1:pos2]...)
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 已遇到前一个FF,且当前遇到非FF,增加gap计数
|
|||
|
gap++
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 尚未遇到前一个FF
|
|||
|
tgt = append(tgt, b)
|
|||
|
if b == 0xFF {
|
|||
|
// 遇到前一个FF
|
|||
|
got1stFF = true
|
|||
|
pos1 = i
|
|||
|
gap = 0
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 如果在数据末尾遇到了FF且没有第二个FF
|
|||
|
if got1stFF {
|
|||
|
if gap > 252 {
|
|||
|
tgt = append(tgt, 0)
|
|||
|
tgt = append(tgt, src[pos1+1:]...)
|
|||
|
} else {
|
|||
|
tgt = append(tgt, 0)
|
|||
|
tgt = append(tgt, src[pos1+1:len(src)]...)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return tgt, nil
|
|||
|
}
|
|||
|
|
|||
|
func TranslateToFFFE3(pSrc []uint8, SrcLen uint16) ([]byte, uint16) {
|
|||
|
var (
|
|||
|
SrcPos, TgtPos, Pos1, Pos2, iii uint16
|
|||
|
Gap uint16
|
|||
|
Got1stFF uint8
|
|||
|
pTgt []uint8
|
|||
|
)
|
|||
|
|
|||
|
if pSrc == nil {
|
|||
|
fmt.Println("入口参数错误")
|
|||
|
return nil, 0
|
|||
|
}
|
|||
|
|
|||
|
pTgt = make([]uint8, 0, SrcLen*2) // 预分配足够的空间以避免频繁扩容
|
|||
|
TgtPos = 0
|
|||
|
|
|||
|
for SrcPos = 0; SrcPos < SrcLen; SrcPos++ {
|
|||
|
if Got1stFF == 1 {
|
|||
|
if pSrc[SrcPos] == 0xFF {
|
|||
|
// 已遇到前一个FF,且当前又遇到FF
|
|||
|
//Got2ndFF = 1
|
|||
|
Pos2 = SrcPos
|
|||
|
pTgt = append(pTgt, uint8(Pos2-Pos1-1))
|
|||
|
TgtPos++
|
|||
|
|
|||
|
for iii = Pos1 + 1; iii < Pos2; iii++ {
|
|||
|
pTgt = append(pTgt, pSrc[iii])
|
|||
|
TgtPos++
|
|||
|
}
|
|||
|
|
|||
|
Got1stFF = 0
|
|||
|
//Got2ndFF = 0
|
|||
|
Pos1 = 0
|
|||
|
Pos2 = 0
|
|||
|
Gap = 0
|
|||
|
} else {
|
|||
|
// 已遇到前一个FF,且当前遇到非FF
|
|||
|
Gap++
|
|||
|
if Gap == 252 {
|
|||
|
Got1stFF = 0
|
|||
|
Gap = 0
|
|||
|
pTgt = append(pTgt, 0)
|
|||
|
TgtPos++
|
|||
|
|
|||
|
for iii = Pos1 + 1; iii <= SrcPos; iii++ {
|
|||
|
pTgt = append(pTgt, pSrc[iii])
|
|||
|
TgtPos++
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 尚未遇到前一个FF
|
|||
|
pTgt = append(pTgt, pSrc[SrcPos])
|
|||
|
TgtPos++
|
|||
|
if pSrc[SrcPos] == 0xFF {
|
|||
|
// 遇到前一个FF
|
|||
|
Got1stFF = 1
|
|||
|
Pos1 = SrcPos
|
|||
|
Gap = 0
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 已经遇到了前一个FF, 且源数据已到了末尾仍未遇到后一个FF
|
|||
|
if Got1stFF == 1 {
|
|||
|
pTgt = append(pTgt, 0)
|
|||
|
TgtPos++
|
|||
|
|
|||
|
for iii = Pos1 + 1; iii < SrcLen; iii++ {
|
|||
|
pTgt = append(pTgt, pSrc[iii])
|
|||
|
TgtPos++
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return pTgt, TgtPos
|
|||
|
}
|