Skip to content

Commit

Permalink
Extract DataEncoderService from packet encoding to EOLib.IO
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanmoffat committed Mar 12, 2022
1 parent c7facbb commit fc1f1f7
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 97 deletions.
106 changes: 106 additions & 0 deletions EOLib.IO/Services/DataEncoderService.cs
@@ -0,0 +1,106 @@
using AutomaticTypeMapper;
using System.Collections.Generic;
using System.Linq;

namespace EOLib.IO.Services
{
[AutoMappedType]
public class DataEncoderService : IDataEncoderService
{
public List<byte> Interleave(IReadOnlyList<byte> data)
{
var numArray = new byte[data.Count];
var index1 = 0;
var num = 0;

while (index1 < data.Count)
{
numArray[index1] = data[num++];
index1 += 2;
}

var index2 = index1 - 1;
if (data.Count % 2 != 0)
index2 -= 2;

while (index2 >= 0)
{
numArray[index2] = data[num++];
index2 -= 2;
}

return numArray.ToList();
}

public List<byte> Deinterleave(IReadOnlyList<byte> data)
{
var numArray = new byte[data.Count];
var index1 = 0;
var num = 0;

while (index1 < data.Count)
{
numArray[num++] = data[index1];
index1 += 2;
}

var index2 = index1 - 1;
if (data.Count % 2 != 0)
index2 -= 2;

while (index2 >= 0)
{
numArray[num++] = data[index2];
index2 -= 2;
}

return numArray.ToList();
}

public List<byte> FlipMSB(IReadOnlyList<byte> data)
{
return data.Select(x => (byte)(x ^ 0x80u)).ToList();
}

public List<byte> SwapMultiples(IReadOnlyList<byte> data, int multi)
{
int num1 = 0;

var result = data.ToArray();

for (int index1 = 0; index1 <= data.Count; ++index1)
{
if (index1 != data.Count && data[index1] % multi == 0)
{
++num1;
}
else
{
if (num1 > 1)
{
for (int index2 = 0; index2 < num1 / 2; ++index2)
{
byte num2 = data[index1 - num1 + index2];
result[index1 - num1 + index2] = data[index1 - index2 - 1];
result[index1 - index2 - 1] = num2;
}
}
num1 = 0;
}
}

return result.ToList();
}
}

public interface IDataEncoderService
{
List<byte> Interleave(IReadOnlyList<byte> data);

List<byte> Deinterleave(IReadOnlyList<byte> data);

List<byte> FlipMSB(IReadOnlyList<byte> data);

List<byte> SwapMultiples(IReadOnlyList<byte> data, int multi);
}
}
106 changes: 10 additions & 96 deletions EOLib/Net/PacketProcessing/PacketEncoderService.cs
Expand Up @@ -15,10 +15,13 @@ namespace EOLib.Net.PacketProcessing
public sealed class PacketEncoderService : IPacketEncoderService
{
private readonly INumberEncoderService _numberEncoderService;
private readonly IDataEncoderService _dataEncoderService;

public PacketEncoderService(INumberEncoderService numberEncoderService)
public PacketEncoderService(INumberEncoderService numberEncoderService,
IDataEncoderService dataEncoderService)
{
_numberEncoderService = numberEncoderService;
_dataEncoderService = dataEncoderService;
}

public byte[] PrependLengthBytes(byte[] data)
Expand All @@ -40,9 +43,9 @@ public byte[] Encode(IPacket original, byte encodeMultiplier)
return original.RawData.ToArray();

var byteList = original.RawData.ToList();
byteList = SwapMultiples(byteList, encodeMultiplier);
byteList = Interleave(byteList);
byteList = FlipMSB(byteList);
byteList = _dataEncoderService.SwapMultiples(byteList, encodeMultiplier);
byteList = _dataEncoderService.Interleave(byteList);
byteList = _dataEncoderService.FlipMSB(byteList);

return byteList.ToArray();
}
Expand All @@ -54,9 +57,9 @@ public IPacket Decode(IEnumerable<byte> original, byte decodeMultiplier)
return new Packet(originalBytes);

var byteList = originalBytes.ToList();
byteList = FlipMSB(byteList);
byteList = Deinterleave(byteList);
byteList = SwapMultiples(byteList, decodeMultiplier);
byteList = _dataEncoderService.FlipMSB(byteList);
byteList = _dataEncoderService.Deinterleave(byteList);
byteList = _dataEncoderService.SwapMultiples(byteList, decodeMultiplier);

return new Packet(byteList);
}
Expand Down Expand Up @@ -115,95 +118,6 @@ private List<byte> PrependLength(IReadOnlyList<byte> data)
}

#endregion

#region Encode/Decode

private static List<byte> Interleave(IReadOnlyList<byte> data)
{
var numArray = new byte[data.Count];
var index1 = 0;
var num = 0;

while (index1 < data.Count)
{
numArray[index1] = data[num++];
index1 += 2;
}

var index2 = index1 - 1;
if (data.Count % 2 != 0)
index2 -= 2;

while (index2 >= 0)
{
numArray[index2] = data[num++];
index2 -= 2;
}

return numArray.ToList();
}

private static List<byte> Deinterleave(IReadOnlyList<byte> data)
{
var numArray = new byte[data.Count];
var index1 = 0;
var num = 0;

while (index1 < data.Count)
{
numArray[num++] = data[index1];
index1 += 2;
}

var index2 = index1 - 1;
if (data.Count % 2 != 0)
index2 -= 2;

while (index2 >= 0)
{
numArray[num++] = data[index2];
index2 -= 2;
}

return numArray.ToList();
}

private static List<byte> FlipMSB(IReadOnlyList<byte> data)
{
return data.Select(x => (byte)(x ^ 0x80u)).ToList();
}

private static List<byte> SwapMultiples(IReadOnlyList<byte> data, int multi)
{
int num1 = 0;

var result = data.ToArray();

for (int index1 = 0; index1 <= data.Count; ++index1)
{
if (index1 != data.Count && data[index1] % multi == 0)
{
++num1;
}
else
{
if (num1 > 1)
{
for (int index2 = 0; index2 < num1 / 2; ++index2)
{
byte num2 = data[index1 - num1 + index2];
result[index1 - num1 + index2] = data[index1 - index2 - 1];
result[index1 - index2 - 1] = num2;
}
}
num1 = 0;
}
}

return result.ToList();
}

#endregion
}

public interface IPacketEncoderService
Expand Down
2 changes: 1 addition & 1 deletion PacketDecoder/MainForm.cs
Expand Up @@ -42,7 +42,7 @@ public MainForm()
_packetEncoderRepository = new PacketEncoderRepository();
_packetProcessActions = new PacketProcessActions(new SequenceRepository(),
_packetEncoderRepository,
new PacketEncoderService(new NumberEncoderService()),
new PacketEncoderService(new NumberEncoderService(), new DataEncoderService()),
new PacketSequenceService(),
new LoggerProvider(new LoggerFactory(new ConfigurationRepository())));
}
Expand Down

0 comments on commit fc1f1f7

Please sign in to comment.