Search code examples
ioscocoa-touchgame-centergamekit

How to send int between 32bit and 64bit processors iOS


Pretty much the title, I send an int in a struct using Gamekit and on the receiving end the other device gets it. Between 64bit cpus (iPhone 5S and over) the number is received fine. But when a iPhone 5 gets it (32bit cpu) the int is received as 0. Whats the correct way?

I've tried sending as NSInteger and the results are the same.

I have to add I have this issue with u_int_32t: When devices connect, each device trades random numbers. These numbers determine which player starts, and I'm using u_int_32t for this, however, 32bit cpus still receive 0. For example:

I declare uint32_t _ourRandomNumber;

Then, _ourRandomNumber = arc4random();

And then the numbers are sent, in a struct like this.

typedef struct {
    Message message;
    uint32_t randomNumber;
} MessageRandomNumber;

Using a method like this:

- (void)sendRandomNumber{
    MessageRandomNumber message;
    message.message.messageType = kMessageTypeRandomNumber;
    message.randomNumber = _ourRandomNumber;
    NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageRandomNumber)];
    [self sendData:data];
}

When the 32 bit cpu receives it then in the receiving method:

Message *message = (Message*)[data bytes];
if (message->messageType == kMessageTypeRandomNumber) {
    MessageRandomNumber *messageRandomNumber = (MessageRandomNumber*)[data bytes];

    NSLog(@"Received random number:%d", messageRandomNumber->randomNumber);

The NSLog shows: Received random number:0


Solution

  • NSInteger is going to be 64-bit on a 64-bit platform and 32-bit on a 32-bit platform. If you don't care about 64-bit precision, you could always use an int32_t (or a u_int32_t if you want unsigned) type to explicitly just use a 32-bit value. It is generally wise to be explicit about data lengths when sending values between devices, which is what these types exist for (there's int8_t, int16_t, int32_t, and int64_t and their unsigned counterparts).

    It's also worth mentioning that you need to be concerned about the byte order of the values (assuming larger values than int8_t and u_int8_t) when sending values to arbitrary hardware. If you're only working with iOS devices this isn't going to be an issue, however.