Понимание порядка байтов и таких функций, как CFSwapInt32HostToBig - PullRequest
1 голос
/ 16 июня 2010

У меня есть перечисление в моей игре.Простое строковое сообщение с добавленным PacketType отправляется вместе с сообщением (поэтому он знает, что делать с сообщением) через WIFI-соединение GameKit.В качестве отправной точки я использовал образец кода Apple GKRocket.

Сам код работает фантастически;Я просто хочу понять, что делает строка с CFSwapInt32HostToBig. Что, черт возьми, это делает?и почему он должен это делать? Я предполагаю, что он удостоверяется, что значение PacketType может быть преобразовано в целое число без знака, чтобы оно могло отправлять его надежно, но это мне не кажется правильным.

В документации говорится: «Преобразует 32-разрядное целое число из формата с прямым порядком байтов в собственный порядок байтов хоста».но я не понимаю, что на самом деле означает.

typedef enum {
    PacketTypeStart,         // packet to notify games to start
    PacketTypeRequestSetup,  // server wants client info
    PacketTypeSetup,         // send client info to server
    PacketTypeSetupComplete, // round trip made for completion
    PacketTypeTurn,          // packet to notify game that a turn is up
    PacketTypeRoll,          // packet to send roll to players 
    PacketTypeEnd            // packet to end game
} PacketType; 

// ....

- (void)sendPacket:(NSData *)data ofType:(PacketType)type
{
    NSLog(@"sendPacket:ofType(%d)", type);
    // create the data with enough space for a uint
    NSMutableData *newPacket = [NSMutableData dataWithCapacity:([data length]+sizeof(uint32_t))];
    // Data is prefixed with the PacketType so the peer knows what to do with it.
    uint32_t swappedType = CFSwapInt32HostToBig((uint32_t)type);
    // add uint to data
    [newPacket appendBytes:&swappedType length:sizeof(uint32_t)];
    // add the rest of the data
    [newPacket appendData:data];

    // Send data checking for success or failure
    NSError *error;
    BOOL didSend = [_gkSession sendDataToAllPeers:newPacket withDataMode:GKSendDataReliable error:&error];
    if (!didSend)
    {
        NSLog(@"error in sendDataToPeers: %@", [error localizedDescription]);
    }
}

1 Ответ

3 голосов
/ 16 июня 2010

Сетевые данные с прямым порядком байтов.Клиенты могут быть с прямым порядком байтов (например, PowerPC Mac) или с прямым порядком байтов (например, x86 Mac).Таким образом, ваш код гарантирует, что endianness обрабатывается на платформах с прямым порядком байтов (например, x86) - и это, конечно же, запрет на системы с прямым порядком байтов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...