작성
·
73
·
수정됨
0
ServerSession 클래스의 Write 함수의 일부입니다.
// 최종적으로 패킷의 크기를 할당하기 위한 공간 확보
count += sizeof(ushort);
success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), this.packetId);
count += sizeof(ushort);
success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), this.playerId);
count += sizeof(long);
BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), this.packetId); 와 같이 스팬을 자를 때 왜 s.Length - count로 count 부터 남은 공간을 전부 자르는 건가요?
ushort 크기를 사용할 것이기에 s.Slice(count, sizeof(ushort))로 사용할 공간만 잘라서 사용하는 것이 더 효율적인 것이 아닌가요?
+추가
이 이유가 강의에서 말씀해주셨던 누군가가 이상한 값을 할당해 정확한 크기가 전달되지 않을 가능성이 있어서 남은 공간을 모두 확인하려는 의도일까요??
답변 1
1
안녕하세요, 인프런 AI 인턴입니다. shimnaldo님.
비슷한 질문이나 해결 방법을 제시하는 기존 답변을 찾아보았는데, BitConverter와 Slice 메소드의 사용에 대한 일반적인 사용 예제와 비슷한 질문이 몇 가지 있었습니다. 이에 따라 관련 내용을 요약하여 설명드리겠습니다.
BitConverter.TryWriteBytes
메소드는 지정된 스팬에 데이터를 기록하면서, 지정된 타입의 크기만큼 공간을 차지합니다. 이 때 s.Slice(count, s.Length - count)
를 사용하는 이유는 데이터가 기록될 공간으로 이 스팬의 남은 부분을 사용하기 위함입니다. 앞의 count
는 기본적으로 이미 사용된 공간을 나타내며, 아직 사용할 수 있는 부분은 s.Length - count
를 통해 설정된 것입니다.
질문에서 지적하신 것처럼 s.Slice(count, sizeof(ushort))
로 필요한 크기만 자르는 것이 더 나아 보일 수도 있지만, 실제로 중요한 점은 TryWriteBytes
메소드가 실패했을 때 오류를 피할 수 있도록 남은 공간을 최대한 활용하는 것입니다. 만약 예상하지 못한 데이터가 들어왔을 경우, 오류를 조기 발견할 수 있도록 충분한 공간을 남기는 것이 안전합니다.
질문에 추가하신 내용처럼, 누군가가 데이터 구조를 잘못 사용했을 가능성을 미리 차단하려는 의도일 수 있습니다. 스팬의 남은 공간 전체를 담을 수 있게 함으로써 누락 없이 데이터를 기록하고 오류 발생을 줄일 수 있습니다. 이러한 방식은 코드의 안정성과 신뢰성을 높이는 데 기여합니다.
유사한 질문과 관련해서 기존 질문 사례들을 살펴보시면 좀 더 이해에 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.