我在玩網絡遊戲,並且將一大堆數據的數據包轉換爲我想要的數值的路塊。想要將字符數組的部分轉換/值轉換爲值
基本上我已經做了一個我期待我的數據包看起來有點樣子的樣機包。本質上是一個Char(8位值),表示消息是什麼,然後由switch語句檢測到,然後在該8位值之後根據數據填充值。我期待我的信息包裏有各種信息,而這些信息可能並不合適。
例如,我可以結束與心跳末,或從聊天消息的文本字符串,等等
我只是希望能夠告訴我的計劃,請從數據字符數組和特定字符串中的某個點(如果這是它的術語?)將它們變成我想要它們的東西。什麼是一個很好的簡單的方法來做到這一點?
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
繼Clairvoire的想法,我增加了以下內容。
playerPosition.X = long(bufferIncoming[3]) << 24 | long(bufferIncoming[4]) << 16 | long(bufferIncoming[5]) << 8 | long(bufferIncoming[6]);
注意我改變了移位值。
另一個重要變化是
unsigned char bufferIncoming[15]
如果我不這樣做,我得到負值每個單元的組合混合。我不知道編譯器在引擎蓋下做了什麼,但是它讓人感到非常討厭。
正如你可以想象,這不是我的首選解決方案,但我會給它一個去。 「乍得」就是一個很好的例子,我可以如何構建它,而另一位工作程序員也推薦他的實現。但...
我有這種感覺,必須有更快更乾淨的方式做我想做的事情。我試過類似的東西...
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 buffer的某處,並說「嘿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
...爲什麼犯規它的工作一樣,或者類似的東西?
G'night給你。 –
你可以通過使用「position.Y = *((long int *)buffer + 9)」來完成你在編輯中最後提到的內容;「我相信,但有一點是阻礙。如果兩臺計算機通信有不同的端點,將發生什麼情況是計算機A會將該整數存儲爲四個字節,即ABC D.然後,接收計算機將這四個字節重新組合爲DCB A. –