我正在尝试发送一条包含结构的游戏中心的消息,大致跟随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
}
}
似乎数据正在正确保存,因为我能够立即将其打印出来而没有问题,但我的想法是数据指向内存中的地址,这样就可以打印出来在发送设备上输出正确的东西,但不是接收设备。话虽如此,我不知道如何解决这个问题,或者如果事实如此,我应该如何在结构中发送字符串。
答案 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];
}