1
This commit is contained in:
@@ -293,24 +293,22 @@ func (s *Server) onevent(c gnet.Conn, v []byte) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// XORDecryptU 优化后的异或解密:减少内存分配,支持复用缓冲区
|
||||
func XORDecryptU(encryptedData []byte, key uint32) []byte {
|
||||
// 边界条件:待解密数据为空,直接返回空
|
||||
if len(encryptedData) == 0 {
|
||||
return []byte{}
|
||||
}
|
||||
|
||||
// 1. 将uint32密钥转换为4字节数组(关键步骤)
|
||||
// 字节序选择:BigEndian(大端)是AS3/Java等语言的默认二进制处理方式,若需小端可改为binary.LittleEndian
|
||||
keyBytes := make([]byte, 4) // uint32固定占4个字节
|
||||
binary.BigEndian.PutUint32(keyBytes, key)
|
||||
keyLen := len(keyBytes) // 固定为4,无需额外判断长度
|
||||
// 预分配密钥字节数组(可全局缓存,避免每次创建)
|
||||
var keyBytes [4]byte // 栈上分配,比make更高效
|
||||
binary.BigEndian.PutUint32(keyBytes[:], key)
|
||||
keyLen := len(keyBytes)
|
||||
|
||||
// 2. 执行异或解密(逻辑与原版本一致,仅密钥来源不同)
|
||||
// 复用输出缓冲区:如果需要极致性能,可传入外部缓冲区
|
||||
decrypted := make([]byte, len(encryptedData))
|
||||
for i, b := range encryptedData {
|
||||
// 循环复用4字节密钥(索引取模,i%4)
|
||||
keyIndex := i % keyLen
|
||||
decrypted[i] = b ^ keyBytes[keyIndex]
|
||||
decrypted[i] = b ^ keyBytes[i%keyLen]
|
||||
}
|
||||
|
||||
return decrypted
|
||||
|
||||
Reference in New Issue
Block a user