PacketByte Support 라이브러리

그 기회가 오기 전까지 열심히 꾸려놓고있겠습니다 :slight_smile:

3개의 좋아요

1.1.0 버전 업데이트 하였습니다.

  • PacketWriter 삭제 → PacketBuilder로 대체
  • PacketBuilder 주요 메서드
  1. Append, Build
5개의 좋아요

닷넷데브발 멋진 라이브러리가 되어서 국내외로 많이 쓰이면 좋겠습니다.

그런 의미에서 아이콘도 추가해 보시면 어떻겠습니까!

아래는 추천입니다

Flaticon

7개의 좋아요

안그래도 고민을 하고 있었는데 감사합니다!

3개의 좋아요

추천에 추천합니다.

3개의 좋아요

Crc, Checksum에 대해 알고리즘을 찾아서 직접 넣어 구현을 할까 고민을 하다가
이미 어떤 분께서 라이브러리 만들어놓으셨더군요…

그래서 그냥 라이브러리를 그대로 사용하고자 합니다!
(사용하기 위해선…netstandard2.0에서 → netstandard2.1로 올려야하지만 뭐 0.1버전정도야…!)

nuget 주소

github 주소

        public PacketBuilder ErrorDetection(Checksum8Type checkSum8)
        {
            byte[] errorcheck = new Checksum8 (checkSum8).Compute (this.packetData.ToArray ()).ToArray();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(Checksum8Type checkSum8, int start)
        {
            byte[] errorcheck = new Checksum8 (checkSum8).Compute (this.packetData.Skip (start - 1).ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(Checksum8Type checkSum8, int start, int count)
        {
            byte[] errorcheck = new Checksum8 (checkSum8).Compute (this.packetData.Skip (start - 1).Take (count).ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(CRC8Type Crc8Type)
        {
            byte[] errorcheck = new CRC8 (Crc8Type).Compute (this.packetData.ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(CRC8Type Crc8Type, int start)
        {
            byte[] errorcheck = new CRC8 (Crc8Type).Compute (this.packetData.Skip (start - 1).ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);
            
            return this;
        }
        public PacketBuilder ErrorDetection(CRC8Type Crc8Type, int start, int count)
        {
            byte[] errorcheck = new CRC8 (Crc8Type).Compute (this.packetData.Skip (start - 1).Take (count).ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(CRC16Type Crc16Type)
        {
            byte[] errorcheck = new CRC16 (Crc16Type).Compute (this.packetData.ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(CRC16Type Crc16Type, int start)
        {
            byte[] errorcheck = new CRC16 (Crc16Type).Compute (this.packetData.Skip (start - 1).ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(CRC16Type Crc16Type, int start, int count)
        {
            byte[] errorcheck = new CRC16 (Crc16Type).Compute (this.packetData.Skip (start - 1).Take (count).ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(CRC32Type Crc32Type)
        {
            byte[] errorcheck = new CRC32 (Crc32Type).Compute (this.packetData.ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(CRC32Type Crc32Type, int start)
        {
            byte[] errorcheck = new CRC32 (Crc32Type).Compute (this.packetData.Skip (start - 1).ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

        public PacketBuilder ErrorDetection(CRC32Type Crc32Type, int start, int count)
        {
            byte[] errorcheck = new CRC32 (Crc32Type).Compute (this.packetData.Skip (start - 1).Take (count).ToArray ()).ToArray ();
            this.packetData.AddRange (errorcheck);

            return this;
        }

위 라이브러리를 가지고 ErrorDetection이라는 메서드를 통해 에러검출 코드를 구현하였습니다.
ErrorDetection말고 Append와 찰떡일것만 같은 뭐가있을까욥…?! :thinking:

4개의 좋아요

이런 느낌은 어떨까요?

  1. 체크섬이 앞쪽에 배치되는 케이스
var packet = pb
  .Append(0x01)  // CMD
  .Checksum(Checksum.Sum8) // 8비트 체크섬이 삽입되는 위치
  .ChecksumStart()
  .Append(0x02)
  .Append(0x03)
  .Append(0x04)
  .Append(0x05)
  .ChecksumEnd()
  .Build();
  1. 체크섬이 뒷쪽에 배치되는 케이스
var packet = pb
  .Append(0x01)  // CMD
  .ChecksumStart()
  .Append(0x02)
  .Append(0x03)
  .Append(0x04)
  .Append(0x05)
  .ChecksumEnd()
  .Checksum(Checksum.Sum8) // 8비트 체크섬이 삽입되는 위치
  .Build();
4개의 좋아요

아…! 왜 저는 이런생각을 못했죠…!

3개의 좋아요

디폴트 Endian을 설정하는 기능이 있으면 어떨까요?

1개의 좋아요

어엇…
잠재적으로 위험하지 않을까요…?

1개의 좋아요

디폴트 값 같은 경우는 Constructornullable pararmeter
Configuration 클래스를 별도로 넘기는게 어떨까요.

public PacketBuilder(PacketBuilderConfiguration? config)
{
   ...
}
var config = new PacketBuilderConfiguration
{
    DefaultEndian = Endian.LITTLE,
    MaxCapacity = 10
};
var bytes = new PacketBuilder(config)
                             .Append(1);
3개의 좋아요

CheckSumStart, End 메서드를 다른 개념으로 확장해서 쓸 수 있게

SavePointStart(Key값);
SavePointEnd(Key값);

이렇게 임시로 ByteArray로 범위로 지정하여 Array에 대한 영역을 저장해서

var packet = pb
  .Append(0x01)  // CMD
  .SavePointStart("임시저장")
  .Append(0x02)
  .Append(0x03)
  .Append(0x04)
  .Append(0x05)
  .SavePointEnd("임시저장");
  .Checksum("임시저장", Checksum.Sum8) // 8비트 체크섬이 삽입되는 위치
  .Build();

var savePacket = packet.GetSavePoint("임시저장");

요런식으로 한다면…어떨까 고민이되네요!

4개의 좋아요

아이디어 박스 시네요…와…

3개의 좋아요

좋아보여요~
추가적으로 현재 시스템의 엔디안을 고려해서 적용해보면 편리한 기능이 나오지 않을까요~?

2개의 좋아요

Checksum 구하는방법

SavePoint방식을 도입함으로써 2가지 타입으로 나뉘게 되었습니다!
SavePoint는 Checksum 외에도 임시적으로 저장해야될 영역에 대해서도 확장하는 용도로도 사용이 가능합니다.

ErrorDetection 방식

var packet = pb
  .Append(0x01)  // CMD
  .Append(0x02)
  .Append(0x03)
  .Append(0x04)
  .Append(0x05)
  .ErrorDetection(Checksum8Type.Xor) 
  .Build();
// or
//   .ErrorDetection(Checksum8Type.Xor, start index);
// or
//   .ErrorDetection(Checksum8Type.Xor, start index, count); 

PointSave 방식

var packet = pb
  .Append(0x01)  // CMD
  .PointSaveStart("ChecksumPacking")
  .Append(0x02)
  .Append(0x03)
  .Append(0x04)
  .Append(0x05)
  .PointSaveEnd("ChecksumPacking");
  .Checksum("ChecksumPacking", Checksum8Type.Xor) // 8비트 체크섬이 삽입되는 위치
  .Build();

// 확장 예
var savePacket = packet.GetSavePoint("ChecksumPacking");
2개의 좋아요

DefaultEndian 설정

 var test = new byte[] { 0x01, 0x02, };
 var testAdd = new byte[] { 0x03, 0x04 };

 var builder1 = new PacketBuilder ()
                                  .Append (test)
                                  .Append (testAdd)
                                  .Build();

 var builder2 = new PacketBuilder (new PacketBuilderConfiguration()
                                     {
                                         DefaultEndian = BytePacketSupport.Enums.Endian.LITTLE
                                     })
                                    .Append (test)
                                    .Append (testAdd)
                                    .Build();

 Console.WriteLine ("builder1 {0}", builder1 .Display ());
 Console.WriteLine ("builder2 {0}", builder2 .Display ());

// output
// display1 : 01020304
// display2 : 02010403
3개의 좋아요

@BOBx5 추천해주신 아이콘…찰떡이네요 :slight_smile:

6개의 좋아요

와 피드백 반영 속도 보소! 멋집니다!

3개의 좋아요

현재 의견받아서 처리하는게 행복하지만…
이 행복 같이 나누고싶네요…

언제든 PR 환영합니다!

7개의 좋아요

맘에 드신다니 뿌듯합니다 ㅎㅎㅎ

3개의 좋아요