나는 네트워킹으로 놀고 있는데, 나는 많은 값의 패킷을 내가 원하는 값으로 변환하면서 약간의 도로 블록을 쳤다.문자 배열의 번역/형변환 부분을 값으로 바꾸기
기본적으로 나는 내 패킷이 조금 보이기를 기대하는 패킷을 만들었습니다. 본질적으로 메시지가 무엇인지 나타내는 Char (8 비트 값)이며 스위치 문에서 감지하여 해당 8 비트 값 다음의 데이터를 기반으로 값을 채 웁니다. 내 패킷에는 순서에 있지 않을 수도있는 모든 종류의 메시지가 포함될 것으로 예상됩니다.
예, 나는 등 끝에 심장 박동, 또는 채팅 메시지의 텍스트 문자열로 끝낼 수
난 그냥 내 프로그램으로 말할 수있을 a로부터 데이터를 먹고 싶어char 배열의 특정 포인트와 타입 변환 (원하는 경우)? 그렇게하는 쉬운 방법은 무엇입니까? Clairvoire의 아이디어에 따라
char bufferIncoming[15];
ZeroMemory(bufferIncoming,15);
//Making a mock packet
bufferIncoming[0] = 0x01; //Heartbeat value
bufferIncoming[1] = 0x01; //Heartbeat again just cause I can
bufferIncoming[2] = 0x10; //This should = 16 if its just an 8bit number,
bufferIncoming[3] = 0x00; // This
bufferIncoming[4] = 0x00; // and this
bufferIncoming[5] = 0x00; // and this
bufferIncoming[6] = 0x09; // and this should equal "9" of its is a 32bit number (int)
bufferIncoming[7] = 0x00;
bufferIncoming[8] = 0x00;
bufferIncoming[9] = 0x01;
bufferIncoming[10] = 0x00; //These 4 should be 256 I think when combines into an unsigned int
//End of mockup packet
int bufferSize = 15; //Just an arbitrary value for now
int i = 0;
while (i < bufferSize)
{
switch (bufferIncoming[i])
{
case 0x01: //Heart Beat
{
cout << "Heartbeat ";
}
break;
case 0x10: //Player Data
{
//We've detected the byte that indicates the following 8 bytes will be player data. In this case a X and Y position
playerPosition.X = ??????????; //How do I combine the 4 hex values for this?
playerPosition.Y = ??????????;
}
break;
default:
{
cout << ".";
}
break;
}
i++;
}
cout << " End of Packet\n";
UPDATE
나는 다음을 추가했습니다.playerPosition.X = long(bufferIncoming[3]) << 24 | long(bufferIncoming[4]) << 16 | long(bufferIncoming[5]) << 8 | long(bufferIncoming[6]);
공지 사항 나는 시프트 값을 변경했다. 나는 음의 값을 받고 된 각 요소의 결합과 혼합되고, 그렇게하지 않은 경우
또 다른 중요한 변화는
unsigned char bufferIncoming[15]
이었다. 나는 컴파일러가 후드에서 무엇을하고 있었는지 모르지만 피투성이였다.
내가 상상할 수있는 것처럼 이것이 내 선호하는 해결책은 아니지만 한 번 사용해 보도록하겠습니다. "차드 (Chad)"는 어떻게 구조화 할 수 있었는지에 대한 좋은 예를 보여 주었고 직장 동료 프로그래머도 구현을 권장했습니다. 하지만 ...
나는 내가 원하는 것을 더 빠르고 깨끗하게 처리해야한다는 느낌을 가지고 있습니다. 나는 같은 것을 시도했다 ...
playerPosition.X = *(bufferIncoming + 4) //Only giving me the value of the one hex value, not the combined >_<
playerPosition.X = reinterpret_cast<unsigned long>(&bufferIncoming); //Some random number that I dont know what it was
. 그리고 나는 그 중 하나도 작동하지 않았다 삭제했습니다. 내가 예상했던 것은 char 버퍼의 어딘가를 가리키며 "hey playerPosition,이 위치에서 읽기 시작하고 거기에있는 바이트 데이터를 기반으로 값을 채우십시오"라고 말합니다. 이러한 어쩌면 같은
...
playerPosition = (playerPosition)bufferIncoming[5]; //Reads from this spot and fills in the 8 bytes worth of data
//or
playerPosition.Y = (playerPosition)bufferIncoming[9]; //Reads in the 4 bytes of values
이 ... 왜 그, 또는 비슷한처럼 작동 나던?
안녕하세요. –
"position.Y = * ((long int *) buffer + 9);"를 사용하여 편집에서 마지막으로 언급 한 내용을 수행 할 수 있습니다. 나는 믿는다. 그러나 방해가되는 것은 엔디안이다. 통신하는 두 대의 컴퓨터가 서로 다른 엔디안을 사용하는 경우 컴퓨터 A는 정수를 ABC D의 4 바이트로 저장합니다. 수신 컴퓨터는이 4 바이트를 다시 DCB A로 저장합니다. –