TLSharp/TeleSharp.TL/TLUtils.cs

161 lines
4.2 KiB
C#
Raw Normal View History

2017-04-13 08:38:01 +02:00
using System.IO;
2016-09-24 15:38:26 +02:00
using System.Text;
namespace TeleSharp.TL
{
2017-04-13 08:38:01 +02:00
public class IntegerUtil
2016-09-24 15:38:26 +02:00
{
public static int Deserialize(BinaryReader reader)
{
return reader.ReadInt32();
}
2017-04-13 08:38:01 +02:00
public static void Serialize(int src, BinaryWriter writer)
2016-09-24 15:38:26 +02:00
{
writer.Write(src);
}
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public class BytesUtil
{
private static byte[] read(BinaryReader binaryReader)
{
2017-04-13 08:38:01 +02:00
var firstByte = binaryReader.ReadByte();
2016-09-24 15:38:26 +02:00
int len, padding;
if (firstByte == 254)
{
len = binaryReader.ReadByte() | (binaryReader.ReadByte() << 8) | (binaryReader.ReadByte() << 16);
padding = len % 4;
}
2017-04-13 08:38:01 +02:00
else
{
2016-09-24 15:38:26 +02:00
len = firstByte;
padding = (len + 1) % 4;
}
2017-04-13 08:38:01 +02:00
var data = binaryReader.ReadBytes(len);
2016-09-24 15:38:26 +02:00
if (padding > 0)
{
padding = 4 - padding;
binaryReader.ReadBytes(padding);
}
return data;
}
private static BinaryWriter write(BinaryWriter binaryWriter, byte[] data)
{
int padding;
if (data.Length < 254)
{
padding = (data.Length + 1) % 4;
if (padding != 0)
padding = 4 - padding;
2017-04-13 08:38:01 +02:00
binaryWriter.Write((byte) data.Length);
2016-09-24 15:38:26 +02:00
binaryWriter.Write(data);
}
2017-04-13 08:38:01 +02:00
else
{
padding = data.Length % 4;
2016-09-24 15:38:26 +02:00
if (padding != 0)
padding = 4 - padding;
2017-04-13 08:38:01 +02:00
binaryWriter.Write((byte) 254);
binaryWriter.Write((byte) data.Length);
binaryWriter.Write((byte) (data.Length >> 8));
binaryWriter.Write((byte) (data.Length >> 16));
2016-09-24 15:38:26 +02:00
binaryWriter.Write(data);
}
2017-04-13 08:38:01 +02:00
for (var i = 0; i < padding; i++)
binaryWriter.Write((byte) 0);
2016-09-24 15:38:26 +02:00
return binaryWriter;
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public static byte[] Deserialize(BinaryReader reader)
{
return read(reader);
}
public static void Serialize(byte[] src, BinaryWriter writer)
{
2017-04-13 08:38:01 +02:00
write(writer, src);
2016-09-24 15:38:26 +02:00
}
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public class StringUtil
{
public static string Deserialize(BinaryReader reader)
{
2017-04-13 08:38:01 +02:00
var data = BytesUtil.Deserialize(reader);
2016-09-24 15:38:26 +02:00
return Encoding.UTF8.GetString(data, 0, data.Length);
}
2017-04-13 08:38:01 +02:00
public static void Serialize(string src, BinaryWriter writer)
2016-09-24 15:38:26 +02:00
{
BytesUtil.Serialize(Encoding.UTF8.GetBytes(src), writer);
}
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public class BoolUtil
{
public static bool Deserialize(BinaryReader reader)
{
var FalseCNumber = -1132882121;
var TrueCNumber = -1720552011;
var readed = reader.ReadInt32();
if (readed == FalseCNumber) return false;
2017-04-13 08:38:01 +02:00
if (readed == TrueCNumber) return true;
throw new InvalidDataException(string.Format("Invalid Boolean Data : {0}", readed));
2016-09-24 15:38:26 +02:00
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public static void Serialize(bool src, BinaryWriter writer)
{
var FalseCNumber = -1132882121;
var TrueCNumber = -1720552011;
2017-04-13 08:38:01 +02:00
writer.Write(src ? TrueCNumber : FalseCNumber);
2016-09-24 15:38:26 +02:00
}
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public class UIntUtil
{
public static uint Deserialize(BinaryReader reader)
{
return reader.ReadUInt32();
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public static void Serialize(uint src, BinaryWriter writer)
{
writer.Write(src);
}
}
2017-04-13 08:38:01 +02:00
public class DoubleUtil
{
2016-09-24 15:38:26 +02:00
public static double Deserialize(BinaryReader reader)
{
return reader.ReadDouble();
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public static void Serialize(double src, BinaryWriter writer)
{
writer.Write(src);
}
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public class LongUtil
{
public static long Deserialize(BinaryReader reader)
{
return reader.ReadInt64();
}
2017-04-13 08:38:01 +02:00
2016-09-24 15:38:26 +02:00
public static void Serialize(long src, BinaryWriter writer)
{
writer.Write(src);
}
}
2017-04-13 08:38:01 +02:00
}