PacketByte Support 라이브러리

Enidan개념에 Swap있었군요…참고하여 적용해볼게요!

현재1.0 버전보단 2.0을 기다려주세요!
1.0에 버그가 있는데 고치지않고 넘어가는거라…!

3개의 좋아요

고견 감사합니다.

참고하겠습니다!

3개의 좋아요

Array.Copy보단 Buffer.BlockCopy로 이용하고 있기 때문에 기존에 만드셨던 로직의 성능과는 큰 이슈가 없을거라고 봅니다. ( Array.Copy보단 Buffer.BlockCopy가 더 좋다는 얘기가 있긴합니다만…정확하게 뭐가 맞다는 저도 좀 봐야할거같아서…)

다른 성능 테스트 건에 대해 진행한 것이 있긴합니다.

private byte[] TestData()
{
    byte[] arrByte = {0x01};
    for(int i=0; i<10000; i++)
    {
       arrByte.Append<Byte>(BitConverter.GetBytes(i));
    }

    return arrByte;
}

테스트 1

byte[] sourceByte = new byte[]{0x05,0x05,0x05,0x05};
byte[] testData = TestData();
for(int i=0; i<testData.Count(); i++)
{
   arrByte.Append<Byte>(testData[i]);
}

테스트 2

byte[] sourceByte = new byte[]{0x05,0x05,0x05,0x05};
byte[] testData = TestData();

arrByte .@bytes(testData);

한번에 밀어 넣는방식과 bytes array(Buffer.BlockCopy) 이 두개의 테스트군을 진행했었는데
이때, testData 데이터 크기가 적을 땐 하나씩 밀어넣는 방식이 좀 더 빨랐고
반대로 크기가 클 수록 BlockCopy방식이 빨랐습니다.

2개의 좋아요

음 아무리 생각해도 다 맞는 의견들인지라…
결론이 나지 않을 것 같아서 세가지 타입(CLR, csharp, dimohy님 제안)모두 지원하고자 합니다.
(향후 분리를 한다해도 나누면 그만이니…)

  • AppendByte = @byte
  • AppendBytes = @bytes
  • AppendString = @string
  • AppendInt32 = Appendint = @int
  • AppendInt64 = Appendlong = @long
  • AppendInt16 = Appendshort = @short
  • AppendUInt32 = Appenduint =@uint
  • AppendUInt64 = Appendulong = @ulong
  • AppendUInt16 = Appendushort = @ushort
  • AppendClass = @class

땅땅땅?

2개의 좋아요

Git Discussion
@예약어 메서드의 네이밍 변경의 건

논의된 내용을 바탕으로 후보 추려서 투표 올렸습니다!

많은 투표 부탁드립니다~~~

3개의 좋아요

이 부분 때문에 우선은 Append의 메인 메서드 선정 상관없이 사용할 수 있게 해놨습니다.

투표 마치는대로 적용작업을.!


4개의 좋아요

@jrchs
전체 패킷이 다 적용 되는건가요? 아니면 선언한 일부에서만 적용이되는건가요?

2개의 좋아요

주로 패킷의 Body 부분만 적용이 되는데, 전체 다 적용도 되었으면 좋겠습니다.

3개의 좋아요

부분만 적용된다고 하더라도 AppendClass 개념이 있기 때문에 부분적으로 패킷을 나눠 제작할 수 있기 때문에 전체 만 적용하면 되겠네요! :slight_smile:

2개의 좋아요

BIGBYTESWAP과 LITTLEBYTESWAP 기능 추가 한 유닛테스트 샘플코드와 결과입니다.

[Fact]
public void TestShort()
{
    var test1 = new PacketBuilder (new PacketBuilderConfiguration ()
    {
        DefaultEndian = BytePacketSupport.Enums.Endian.BIG
    }).@short (0x1234)
                  .Build ();
    var test2 = new PacketBuilder (new PacketBuilderConfiguration ()
    {
        DefaultEndian = BytePacketSupport.Enums.Endian.LITTLE
    }).@short (0x1234)
                  .Build ();
    var test3 = new PacketBuilder (new PacketBuilderConfiguration ()
    {
        DefaultEndian = BytePacketSupport.Enums.Endian.BIGBYTESWAP
    }).@short (0x1234)
                  .Build ();
    var test4 = new PacketBuilder (new PacketBuilderConfiguration ()
    {
        DefaultEndian = BytePacketSupport.Enums.Endian.LITTLEBYTESWAP
    }).@short (0x1234)
                  .Build ();

    _testOutputHelper.WriteLine (test1.ToHexString ());
    _testOutputHelper.WriteLine (test2.ToHexString ());
    _testOutputHelper.WriteLine (test3.ToHexString ());
    _testOutputHelper.WriteLine (test4.ToHexString ());
}

결과
image

 [Fact]
 public void Testint()
 {
     var test1 = new PacketBuilder (new PacketBuilderConfiguration ()
     {
         DefaultEndian = BytePacketSupport.Enums.Endian.BIG
     }).@int (0x12345678)
                   .Build ();
     var test2 = new PacketBuilder (new PacketBuilderConfiguration ()
     {
         DefaultEndian = BytePacketSupport.Enums.Endian.LITTLE
     }).@int (0x12345678)
                   .Build ();
     var test3 = new PacketBuilder (new PacketBuilderConfiguration ()
     {
         DefaultEndian = BytePacketSupport.Enums.Endian.BIGBYTESWAP
     }).@int (0x12345678)
                   .Build ();
     var test4 = new PacketBuilder (new PacketBuilderConfiguration ()
     {
         DefaultEndian = BytePacketSupport.Enums.Endian.LITTLEBYTESWAP
     }).@int (0x12345678)
                   .Build ();

     _testOutputHelper.WriteLine (test1.ToHexString ());
     _testOutputHelper.WriteLine (test2.ToHexString ());
     _testOutputHelper.WriteLine (test3.ToHexString ());
     _testOutputHelper.WriteLine (test4.ToHexString ());
 }

결과
image

[Fact]
public void Testlong()
{
    var test1 = new PacketBuilder (new PacketBuilderConfiguration ()
    {
        DefaultEndian = BytePacketSupport.Enums.Endian.BIG
    }).@long (0x123456789ABCDEF0)
                  .Build ();
    var test2 = new PacketBuilder (new PacketBuilderConfiguration ()
    {
        DefaultEndian = BytePacketSupport.Enums.Endian.LITTLE
    }).@long (0x123456789ABCDEF0)
                  .Build ();
    var test3 = new PacketBuilder (new PacketBuilderConfiguration ()
    {
        DefaultEndian = BytePacketSupport.Enums.Endian.BIGBYTESWAP
    }).@long (0x123456789ABCDEF0)
                  .Build ();
    var test4 = new PacketBuilder (new PacketBuilderConfiguration ()
    {
        DefaultEndian = BytePacketSupport.Enums.Endian.LITTLEBYTESWAP
    }).@long (0x123456789ABCDEF0)
                  .Build ();

    _testOutputHelper.WriteLine (test1.ToHexString ());
    _testOutputHelper.WriteLine (test2.ToHexString ());
    _testOutputHelper.WriteLine (test3.ToHexString ());
    _testOutputHelper.WriteLine (test4.ToHexString ());
}

결과
image

4개의 좋아요

bit단위기능적용에 대한 기능 설명을 좀 간략해주실수있나요?

  • byte position, bit position, bit size도 같이요!
2개의 좋아요

제가 설명하는 덴 조금 부족해서…
말씀드리자면,

2개의 상태 또는 4개의 상태를 나타내는 항목이 있다면,
메모리 사용량이 제한적인 경우,
비트 1개, 2개면 표현이 충분하거든요…
그래서 바이트 하나를 비트 쪼개서 사용할 경우가 꽤 많습니다.

이런 경우 사용할 수 있는 기능이 있으면 좋겠다라는… 의견이었습니다.
position, size 이런 것들은
위 기능 구현할 때 필요한 요소들에 포함되지 않을까 해서 한번 적어본 것이었어요

4개의 좋아요

Enum의 Flag값 같은 걸 말씀하시는 것과도 비슷한 것 같네요!

3개의 좋아요

감사합니다!
@BOBx5 님이 개발해주실거에요 하하하하!

3개의 좋아요

와… 레전드…

실행력이 다들 대단하시네요 :scream:

4개의 좋아요

같이 참여하시죠…!

3개의 좋아요

약간 요련 느낌인가보네요 :slight_smile:

2개의 좋아요

맞습니다! 저도 종종 응용하는 방법이에요.

2개의 좋아요

2.2.0 업데이트

첫번째 사진의 Compute 메소드는 Mythosia.Integrity의 라이브러리를 사용하여 처리했을 때고,
두번째 사진은 Compute 메소드는 Mythosia.Integrity 라이브러리를 개선한 현재 버전입니다.

7개의 좋아요

훌륭한결과네요!

3개의 좋아요