1

Тема: Допоможіть скласти програму "TCP-протокол та сервер з нуля"

Власне справа от у чому, є ось цей код:
https://teletype.in/@cyberlifes/SJJ0NXUEV
Мені по навчанню потрібно повністю скласти із тих частин, що на сайті, всю програму. В мене вийшло це зробити до першого тесту, де результат :

int: 123
double: 123
float: 123
bool: False

Далі не виходить доповнювати код. Лізуть помилки. Одразу скажу, що я не володію С#, а лише знаю C++, на середньому рівні.
Код додаю, також додаю файл txt з кодом.

Буду радий, якщо хтось зможе повністю скласти програму та скинути її код. Або доповнити той код, що я прикріпив, до того моменту де має пройти другий тест: "После запуска программы должны отобразиться две строки:

Number = 12345
Double = 123,45 "

Буду радий допомозі. Дякую.

Цей контент доступний тільки зареєстрованим користувачам.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.IO;
using System.Runtime.InteropServices;
using System.Reflection;
 
public class XPacket
{
    public byte PacketType { get; private set; }
    public byte PacketSubtype { get; private set; }
    public List<XPacketField> Fields { get; set; } = new List<XPacketField>();
    
   public class XPacketField
{
    public byte FieldID { get; set; }
    public byte FieldSize { get; set; }
    public byte[] Contents { get; set; }
}
   
    private XPacket() {}
 
public static XPacket Create(byte type, byte subtype)
{
    return new XPacket
    {
        PacketType = type,
        PacketSubtype = subtype
    };
}
 
 
public byte[] ToPacket()
{
    var packet = new MemoryStream();
 
    packet.Write(
    new byte[] {0xAF, 0xAA, 0xAF, PacketType, PacketSubtype}, 0, 5);
 
    var fields = Fields.OrderBy(field => field.FieldID);
 
    foreach (var field in fields)
    {
        packet.Write(new[] {field.FieldID, field.FieldSize}, 0, 2);
        packet.Write(field.Contents, 0, field.Contents.Length);
    }
 
    packet.Write(new byte[] {0xFF, 0x00}, 0, 2);
 
    return packet.ToArray();
}
 
public static XPacket Parse(byte[] packet)
{
    if (packet.Length < 7)
    {
        return null;
    }
 
    if (packet[0] != 0xAF ||
        packet[1] != 0xAA ||
        packet[2] != 0xAF)
    {
        return null;
    }
 
    var mIndex = packet.Length - 1;
 
    if (packet[mIndex - 1] != 0xFF ||
        packet[mIndex] != 0x00)
    {
        return null;
    }
 
    var type = packet[3];
    var subtype = packet[4];
 
    var xpacket = Create(type, subtype);
    var fields = packet.Skip(5).ToArray();
 
    while (true)
    {
        if (fields.Length == 2)
        {
            return xpacket;
        }
 
        var id = fields[0];
        var size = fields[1];
 
        var contents = size != 0 ?
        fields.Skip(2).Take(size).ToArray() : null;
 
        xpacket.Fields.Add(new XPacketField
        {
            FieldID = id,
            FieldSize = size,
            Contents = contents
        });
 
        fields = fields.Skip(2 + size).ToArray();
    }
}
 
public byte[] FixedObjectToByteArray(object value)
{
    var rawsize = Marshal.SizeOf(value);
    var rawdata = new byte[rawsize];
 
    var handle = GCHandle.Alloc(rawdata,
        GCHandleType.Pinned);
 
    Marshal.StructureToPtr(value,
        handle.AddrOfPinnedObject(),
        false);
 
    handle.Free();
 
    return rawdata;
}
private T ByteArrayToFixedObject<T>(byte[] bytes) where T: struct 
{
    T structure;
 
    var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
 
    try
    {
        structure = (T) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    }
    finally
    {
        handle.Free();
    }
 
    return structure;
}
 
public XPacketField GetField(byte id)
{
    foreach (var field in Fields)
    {
        if (field.FieldID == id)
        {
            return field;
        }
    }
 
    return null;
}
 
public bool HasField(byte id)
{
    return GetField(id) != null;
}
 
 
public T GetValue<T>(byte id) where T : struct
{
    var field = GetField(id);
 
    if (field == null)
    {
        throw new Exception($"Field with ID {id} wasn't found.");
    }
    var neededSize = Marshal.SizeOf(typeof(T));
 
    if (field.FieldSize != neededSize)
    {
        throw new Exception($"Can't convert field to type {typeof(T).FullName}.\n" + $"We have {field.FieldSize} bytes but we need exactly {neededSize}.");
    }
 
    return ByteArrayToFixedObject<T>(field.Contents);
}
 
public void SetValue(byte id, object structure)
{
    if (!structure.GetType().IsValueType)
    {
        throw new Exception("Only value types are available.");
    }
 
    var field = GetField(id);
 
    if (field == null)
    {
        field = new XPacketField
        {
            FieldID = id
        };
 
        Fields.Add(field);
    }
 
    var bytes = FixedObjectToByteArray(structure);
 
    if (bytes.Length > byte.MaxValue)
    {
        throw new Exception("Object is too big. Max length is 255 bytes.");
    }
 
    field.FieldSize = (byte) bytes.Length;
    field.Contents = bytes;
}
 
}
 
class Program {
    
  static void Main() {
    
    var packet = XPacket.Create(1, 0);
 
packet.SetValue(0, 123);
packet.SetValue(1, 123D);
packet.SetValue(2, 123F);
packet.SetValue(3, false);
 
var packetBytes = packet.ToPacket();
var parsedPacket = XPacket.Parse(packetBytes);
 
Console.WriteLine($"int: {parsedPacket.GetValue<int>(0)}\n" +
                  $"double: {parsedPacket.GetValue<double>(1)}\n" +
                  $"float: {parsedPacket.GetValue<float>(2)}\n" +
                  $"bool: {parsedPacket.GetValue<bool>(3)}");
    
  }
}