그 기회가 오기 전까지 열심히 꾸려놓고있겠습니다
1.1.0 버전 업데이트 하였습니다.
- PacketWriter 삭제 → PacketBuilder로 대체
- PacketBuilder 주요 메서드
- Append, Build
안그래도 고민을 하고 있었는데 감사합니다!
추천에 추천합니다.
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와 찰떡일것만 같은 뭐가있을까욥…?!
이런 느낌은 어떨까요?
- 체크섬이 앞쪽에 배치되는 케이스
var packet = pb
.Append(0x01) // CMD
.Checksum(Checksum.Sum8) // 8비트 체크섬이 삽입되는 위치
.ChecksumStart()
.Append(0x02)
.Append(0x03)
.Append(0x04)
.Append(0x05)
.ChecksumEnd()
.Build();
- 체크섬이 뒷쪽에 배치되는 케이스
var packet = pb
.Append(0x01) // CMD
.ChecksumStart()
.Append(0x02)
.Append(0x03)
.Append(0x04)
.Append(0x05)
.ChecksumEnd()
.Checksum(Checksum.Sum8) // 8비트 체크섬이 삽입되는 위치
.Build();
아…! 왜 저는 이런생각을 못했죠…!
디폴트 Endian을 설정하는 기능이 있으면 어떨까요?
어엇…
잠재적으로 위험하지 않을까요…?
디폴트 값 같은 경우는 Constructor에 nullable pararmeter 로
Configuration 클래스를 별도로 넘기는게 어떨까요.
public PacketBuilder(PacketBuilderConfiguration? config)
{
...
}
var config = new PacketBuilderConfiguration
{
DefaultEndian = Endian.LITTLE,
MaxCapacity = 10
};
var bytes = new PacketBuilder(config)
.Append(1);
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("임시저장");
요런식으로 한다면…어떨까 고민이되네요!
아이디어 박스 시네요…와…
좋아보여요~
추가적으로 현재 시스템의 엔디안을 고려해서 적용해보면 편리한 기능이 나오지 않을까요~?
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");
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
@BOBx5 추천해주신 아이콘…찰떡이네요
와 피드백 반영 속도 보소! 멋집니다!
현재 의견받아서 처리하는게 행복하지만…
이 행복 같이 나누고싶네요…
언제든 PR 환영합니다!
맘에 드신다니 뿌듯합니다 ㅎㅎㅎ