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.
100 lines
3.1 KiB
100 lines
3.1 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace Mirle.Component.SocketDirver.FrameBuilder
|
|
{
|
|
/// <summary>
|
|
/// Google Protobuffer 訊息加解密類別
|
|
/// </summary>
|
|
public class ProtobufferFrameBulder : IFrameBuilder
|
|
{
|
|
/// <inheritdoc/>
|
|
public byte[] EncodeFrame(byte[] payload)
|
|
{
|
|
List<byte> list = new List<byte>();
|
|
long num = payload.LongLength;
|
|
if (num <= 125)
|
|
{
|
|
byte item = (byte)num;
|
|
list.Add(item);
|
|
}
|
|
else if (num <= 65535)
|
|
{
|
|
byte item2 = 126;
|
|
list.Add(item2);
|
|
byte[] bytes = BitConverter.GetBytes(num);
|
|
list.Add(bytes[1]);
|
|
list.Add(bytes[0]);
|
|
}
|
|
else
|
|
{
|
|
byte item3 = 127;
|
|
list.Add(item3);
|
|
byte[] bytes2 = BitConverter.GetBytes(num);
|
|
list.Add(bytes2[7]);
|
|
list.Add(bytes2[6]);
|
|
list.Add(bytes2[5]);
|
|
list.Add(bytes2[4]);
|
|
list.Add(bytes2[3]);
|
|
list.Add(bytes2[2]);
|
|
list.Add(bytes2[1]);
|
|
list.Add(bytes2[0]);
|
|
}
|
|
|
|
list.AddRange(payload);
|
|
return list.ToArray();
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public bool TryDecodeFrame(byte[] buffer, out int receiveCount, out byte[] payload)
|
|
{
|
|
try
|
|
{
|
|
int num = buffer.AsEnumerable().First() & 0x7F;
|
|
int num2 = 1;
|
|
int num3 = 0;
|
|
if (num <= 125)
|
|
{
|
|
num2 = 1;
|
|
num3 = num;
|
|
}
|
|
else
|
|
{
|
|
switch (num)
|
|
{
|
|
case 126:
|
|
{
|
|
num2 = 3;
|
|
byte[] array2 = buffer.Skip(1).Take(2).ToArray();
|
|
num3 = array2[0] * 256 + array2[1];
|
|
break;
|
|
}
|
|
case 127:
|
|
{
|
|
num2 = 9;
|
|
byte[] array = buffer.Skip(1).Take(8).ToArray();
|
|
int num4 = 1;
|
|
for (int i = 0; i < 8; i++)
|
|
{
|
|
num3 += array[8 - i - 1] * num4;
|
|
num4 *= 256;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
receiveCount = num2 + num3;
|
|
payload = buffer.Skip(num2).Take(num3).ToArray();
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.ToString());
|
|
receiveCount = 0;
|
|
payload = null;
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|