TLSharp/TLSharp.Core/MTProto/Serializers.cs
2017-04-13 13:38:01 +07:00

91 lines
2.8 KiB
C#

using System.Collections.Generic;
using System.IO;
using System.Text;
namespace TLSharp.Core.MTProto
{
public class Serializers
{
public static string VectorToString<T>(List<T> list)
{
var tokens = new string[list.Count];
for (var i = 0; i < list.Count; i++)
tokens[i] = list[i].ToString();
return "[" + string.Join(", ", tokens) + "]";
}
public static class Bytes
{
public static byte[] read(BinaryReader binaryReader)
{
var firstByte = binaryReader.ReadByte();
int len, padding;
if (firstByte == 254)
{
len = binaryReader.ReadByte() | (binaryReader.ReadByte() << 8) | (binaryReader.ReadByte() << 16);
padding = len % 4;
}
else
{
len = firstByte;
padding = (len + 1) % 4;
}
var data = binaryReader.ReadBytes(len);
if (padding > 0)
{
padding = 4 - padding;
binaryReader.ReadBytes(padding);
}
return data;
}
public static BinaryWriter write(BinaryWriter binaryWriter, byte[] data)
{
int padding;
if (data.Length < 254)
{
padding = (data.Length + 1) % 4;
if (padding != 0)
padding = 4 - padding;
binaryWriter.Write((byte) data.Length);
binaryWriter.Write(data);
}
else
{
padding = data.Length % 4;
if (padding != 0)
padding = 4 - padding;
binaryWriter.Write((byte) 254);
binaryWriter.Write((byte) data.Length);
binaryWriter.Write((byte) (data.Length >> 8));
binaryWriter.Write((byte) (data.Length >> 16));
binaryWriter.Write(data);
}
for (var i = 0; i < padding; i++)
binaryWriter.Write((byte) 0);
return binaryWriter;
}
}
public static class String
{
public static string read(BinaryReader reader)
{
var data = Bytes.read(reader);
return Encoding.UTF8.GetString(data, 0, data.Length);
}
public static BinaryWriter write(BinaryWriter writer, string str)
{
return Bytes.write(writer, Encoding.UTF8.GetBytes(str));
}
}
}
}