가변길이 데이터 중 문자열을 보내는 방법에 대해 알아보자.
char sendData[1000] = "가"; // CP949
char sendData[1000] = u8"가"; // UTF-8 Unicode (한글 3바이트 + 로마 1바이트)
WCHAR sendData[1000] = L"가"; // UTF-16 (한글, 로마 2바이트)
TCHAR sendData[1000] = _T("가");
ClientPacketHandler.cpp
struct S_TEST
{
uint64 id;
uint32 hp;
uint16 attack;
// 가변 데이터
// 1) 문자열 (ex. name)
// 2) 그냥 바이트 배열 (ex. 길드 이미지)
// 3) 일반 리스트
vector<int64> buffs;
wstring name;
};
...
void ClientPacketHandler::Handle_S_TEST(BYTE* buffer, int32 len)
{
BufferReader br(buffer, len);
PacketHeader header;
br >> header;
...
wstring name;
uint16 nameLen;
br >> nameLen;
name.resize(nameLen);
br.Read((void*)name.data(), nameLen * sizeof(WCHAR));
wcout.imbue(std::locale("kor"));
wcout << name << endl;
}
ServerPacketHandler.cpp
SendBufferRef ServerPacketHandler::Make_S_TEST(uint64 id, uint32 hp, uint16 attack, vector<BuffData> buffs, wstring name)
{
SendBufferRef sendBuffer = GSendBufferManager->Open(4096);
BufferWriter bw(sendBuffer->Buffer(), sendBuffer->AllocSize());
PacketHeader* header = bw.Reserve<PacketHeader>();
...
bw << (uint16)name.size();
bw.Write((void*)name.data(), name.size() * sizeof(WCHAR));
header->size = bw.WriteSize();
header->id = S_TEST; // 1 : Test Msg
sendBuffer->Close(bw.WriteSize());
return sendBuffer;
}
1. 문자열 집합과 인코딩의 차이는?
- 문자열 집합은 문자를 숫자에 매핑한 정보, 인코딩은 매핑한 정보를 어떻게 해석할 것인지에 대한 정보
2. UTF-8 encoding 이란?
- Unicode 문자열 집합을 해석하는 방법, e.g) 첫 바이트 마지막 비트가 0 이면 1바이트 만으로 해석하고 그렇지 않으면 2~3바이트로 해석하는 방법 (한글은 3바이트)
3. UTF-16 encoding 이란?
- Unicode 문자열 집합을 해석하는 방법. UTF-8 과 다르게 BMP 이외 모든 문자를 2바이트로 해석하는 방법
4. CP949 란?
- Encoding 방법, 그런데 2 가지 문자집합을 이용한다.
5. MBCS vs WBCS
- MBCS 는 가변길이 인코딩, WBCS 는 고정길이 인코딩. MBCS 대표로 UTF-8, WBCS 는 UTF-16이 있다.
참조 : [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 대시보드 - 인프런 | 강의 (inflearn.com)
PacketHandler (0) | 2023.05.06 |
---|---|
Buffer Helpers (0) | 2023.04.19 |
Packet Session (0) | 2023.04.16 |
SendBuffer Pooling (0) | 2023.04.05 |
SendBuffer (0) | 2021.12.21 |
댓글 영역