You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.7 KiB
141 lines
3.7 KiB
namespace JiLinApp.Docking.FenceAlarm;
|
|
|
|
public class AlarmEncode
|
|
{
|
|
private static byte[] TEA_key = new byte[16] {
|
|
0x08,0x01,0x08,0x06,0x07,0x08,0x07,0x08,
|
|
0x08,0x90,0xC5,0x04,0x0D,0x0E,0x0F,0x10
|
|
};
|
|
|
|
public static byte[] encodeMessage(byte[] msg)
|
|
{
|
|
if (!checkMessage(msg)) return null;
|
|
return getMessage(msg[0], btea_encrypt(getContent(msg, msg[0] - 1)));
|
|
}
|
|
|
|
public static byte[] decodeMessage(byte[] msg)
|
|
{
|
|
if (!checkMessage(msg)) return null;
|
|
return getMessage(msg[0], btea_decrpyt(getContent(msg, msg[0] - 1)));
|
|
}
|
|
|
|
public static byte[] CRC16(byte[] data)
|
|
{
|
|
int len = data.Length;
|
|
if (len > 0)
|
|
{
|
|
ushort crc = 0xFFFF;
|
|
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
crc = (ushort)(crc ^ (data[i]));
|
|
for (int j = 0; j < 8; j++)
|
|
{
|
|
crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);
|
|
}
|
|
}
|
|
byte hi = (byte)((crc & 0xFF00) >> 8); //高位置
|
|
byte lo = (byte)(crc & 0x00FF); //低位置
|
|
|
|
return new byte[] { hi, lo };
|
|
}
|
|
return new byte[] { 0, 0 };
|
|
}
|
|
|
|
private static byte version = 0x12;
|
|
private static byte[] head = new byte[] { 0xF0, 0xFA };
|
|
private static byte end = 0x0D;
|
|
|
|
public static byte[] getSendMessage(byte command, byte[] data)
|
|
{
|
|
byte[] msg = null;
|
|
if (data == null)
|
|
{
|
|
msg = new byte[8];
|
|
}
|
|
else
|
|
{
|
|
msg = new byte[data.Length + 8];
|
|
}
|
|
msg[0] = (byte)msg.Length;
|
|
msg[1] = version;
|
|
msg[2] = head[0];
|
|
msg[3] = head[1];
|
|
msg[4] = command;
|
|
if (data != null)
|
|
{
|
|
for (int i = 0; i < data.Length; i++)
|
|
{
|
|
msg[i + 5] = data[i];
|
|
}
|
|
}
|
|
byte[] subMsg = null;
|
|
if (data == null)
|
|
{
|
|
subMsg = new byte[4];
|
|
}
|
|
else
|
|
{
|
|
subMsg = new byte[4 + data.Length];
|
|
}
|
|
for (int i = 0; i < subMsg.Length; i++)
|
|
{
|
|
subMsg[i] = msg[i + 1];
|
|
}
|
|
byte[] crc = CRC16(subMsg);
|
|
msg[msg.Length - 3] = crc[1];
|
|
msg[msg.Length - 2] = crc[0];
|
|
msg[msg.Length - 1] = end;
|
|
return msg;
|
|
}
|
|
|
|
private static bool checkMessage(byte[] msg)
|
|
{
|
|
if (msg == null) return false;
|
|
if (msg[0] > msg.Length) return false;
|
|
return true;
|
|
}
|
|
|
|
private static byte[] getContent(byte[] msg, int len)
|
|
{
|
|
byte[] bytes = new byte[len];
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
bytes[i] = msg[i + 1];
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
private static byte[] getMessage(byte msgLen, byte[] msg)
|
|
{
|
|
byte[] out_msg = new byte[msg.Length + 1];
|
|
out_msg[0] = msgLen;
|
|
for (int i = 0; i < msg.Length; i++)
|
|
{
|
|
out_msg[i + 1] = msg[i];
|
|
}
|
|
return out_msg;
|
|
}
|
|
|
|
private static byte[] btea_encrypt(byte[] bytes)
|
|
{
|
|
byte[] output = new byte[bytes.Length];
|
|
for (int i = 0; i < bytes.Length; i++)
|
|
{
|
|
byte abyte = (byte)(bytes[i] ^ TEA_key[i % 16]);
|
|
output[i] = (byte)(((byte)(abyte >> 3)) | ((byte)(abyte << 5)));
|
|
}
|
|
return output;
|
|
}
|
|
|
|
private static byte[] btea_decrpyt(byte[] bytes)
|
|
{
|
|
byte[] output = new byte[bytes.Length];
|
|
for (int i = 0; i < bytes.Length; i++)
|
|
{
|
|
byte abyte = (byte)(((byte)(bytes[i] << 3)) | ((byte)(bytes[i] >> 5)));
|
|
output[i] = (byte)(abyte ^ TEA_key[i % 16]);
|
|
}
|
|
return output;
|
|
}
|
|
}
|