通过游戏中心发送包含在结构中的C字符串

时间:2011-08-02 20:14:38

标签: iphone objective-c game-center

我正在尝试发送一条包含结构的游戏中心的消息,大致跟随Ray Wenderlich的guide。一般来说发送和接收消息都没有问题,但是一旦我用指针扔任何东西我就会有点困惑。目标是将一些字符串和BOOL作为一条消息发送出去。相关代码如下:

//myfile.h
typedef enum {
    kMessageTypeRandomNumber = 0,
    kMessageTypeInterstitial
} MessageType;
typedef struct {
    MessageType messageType;
} Message;
typedef struct {
    Message message;
    char *playerName;
    char *scores;
    BOOL correct;
    char *stat;
} MessageInterstitial;


//myfile.m
- (void)sendData:(NSData *)data {
    NSError *error;
    BOOL success = [[GCHelper sharedInstance].match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error];
    if (!success) {
        NSLog(@"Error sending init packet:\n%@",error);
    }
}
-(void)send{
    MessageInterstitial message;
    message.message.messageType = kMessageTypeInterstitial;
    message.playerName="test";
    NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageInterstitial)];    
    [self sendData:data]; 
    MessageInterstitial * myMessage = (MessageInterstitial *) [data bytes];
    printf("player: %s\n",myMessage->playerName); // prints 'player: test' as expected
}
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
    Message *message = (Message *) [data bytes];
    if(message->messageType == kMessageTypeInterstitial)
    {
        MessageInterstitial * myMessage = (MessageInterstitial *) [data bytes];
        printf("player: %s\n",myMessage->playerName); //prints 'player: ' not expected
    }
}

似乎数据正在正确保存,因为我能够立即将其打印出来而没有问题,但我的想法是数据指向内存中的地址,这样就可以打印出来在发送设备上输出正确的东西,但不是接收设备。话虽如此,我不知道如何解决这个问题,或者如果事实如此,我应该如何在结构中发送字符串。

3 个答案:

答案 0 :(得分:2)

确实这似乎是问题,地址是发送设备中的地址,而不是接收设备。您可以使用char数组,并从头开始分配足够的空间。这样他们就会成为结构的一部分:

// those are just examples of course...
typedef struct {
    Message message;
    char playerName[30];
    char scores[30];
    BOOL correct;
    char stat[15];
} MessageInterstitial;

答案 1 :(得分:1)

你必须使用一个char数组,但有一点是,当你创建你的struct时,这个char数组随机填充各种奇怪的字符,所以这里是如何摆脱这些字符:

typedef struct {
char stringToSend[20];
int stringToSendLength;
} myStruct;

// create a Struct and an NSString
myStruct aStruct;
NSString *stringToConvert = @"stringToConvert";

// convert NSString into char array
for (int i = 0; i < stringToConvert.length; i++) {
    aStruct.stringToSend[i] = [stringToConvert characterAtIndex:i];
}

aStruct.stringToSendLength = stringToConvert.length; // send string length

// store struct into NSData object
NSData *data = [NSData dataWithBytes:&aStruct length:sizeof(myStruct)];

// retrieve data
myStruct *anotherStruct = (myStruct *)[data bytes];

// convert char array into NSString and only keep part required (without some weird random         characters)
NSString *receivedString = [[NSString alloc] initWithBytes:anotherStruct->stringToSend  length:anotherStruct->stringToSendLength encoding:NSASCIIStringEncoding];

答案 2 :(得分:0)

有点老了,但我会投入2美分。

当我从char *更改为char string[30]时,我必须在初始化NSData时增加长度。另外,不可能直接赋值char数组。你要么必须迭代字符串并逐个插入字符,要么像我在下面那样使用strcpy

这就是我最终的样子:

- (void)sendRandomWord:(NSString*)randomWord{
    MessageRandomWord message;
    message.message.messageType = kMessageTypeRandomWord;

    strcpy( message.randomWord, randomWord.UTF8String );

    NSData *data = [NSData dataWithBytes:&message length:sizeof(kMessageTypeRandomWord) + strlen(message.randomWord)*sizeof(char)];
    [self sendData:data];
}