2012-04-23 51 views
0

我想發送struct給GameCenter中的其他玩家。 我已閱讀關於此的其他問題,但是,我無法讓他們中的任何人工作。NSString * to Char [](GameCenter Send Struct)

我需要得到@"1234"char[4](例如炭[0] = '1',炭[1] = '2',等等)

我試圖[NSString UTF8String],但它不似乎不做我想做的事。

它指定罰款,但是當我把它放回NSString *[NSString stringWithUTF8String:],它返回空白。

如果有人可以告訴我轉換和轉換,它將不勝感激。

謝謝。

編輯:

我無法得到它的工作:/這是我的代碼(刪節版):

Matchmaker.h

enum { NChars = 4 }; 

typedef struct { 
    MessageType messageType; 
} Message; 

typedef struct { 
    Message message; 
    char code[NChars]; 
} MessageGameCode; 

@interface Matchmaker : CCLayer <GameCenterMasterDelegate>{ 

    NSString *_code; 
} 
@property (nonatomic,retain) NSString *_code; 

紅娘.m

@synthesize _code; 
-(void)viewDidLoad{ 
    self._code = @"1234"; 
} 

- (void)sendCode { 
    NSLog(@"Sending Code...."); 
    MessageGameCode message; 
    message.message.messageType = kMessageTypeGameCode; 
    NSString * const source = self._code; 

    const char* const sourceAsUTF8 = source.UTF8String; 

    for (size_t idx = 0; idx < NChars; ++idx) { 
     message.code[idx] = sourceAsUTF8[idx]; 
    } 
    NSData *data = [NSData dataWithBytes:&message length:NChars];  
    [self sendData:data]; 
} 

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID { 
    Message *message = (Message *) [data bytes]; 
    if (message->messageType == kMessageTypeGameCode) {   

     MessageGameCode *codeMessage = (MessageGameCode *)[data bytes]; 
     self._code = [[NSString alloc] initWithBytes:codeMessage->code length:NChars encoding:NSUTF8StringEncoding]; 
     [self setGameState:kGameStateWaitingForStart]; 
     NSLog(@"Game Code Recieved"); 
     NSLog(@"Recieved Code: %@",self._code); //This always shows self._code as blank 

    } 
} 

回答

7

您的嘗試將失敗,因爲您傳遞給+ [NSString stringWithUTF8String:]的cstring未終止。

試試這個:

NSString * result = [[NSString alloc] initWithBytes:bytes 
              length:4 
              encoding:NSUTF8StringEncoding]; 

編輯

更完整的演示:

enum { NChars = 4 }; 
/* requires error checking */ 
void transmit() { 
    NSString * const source = @"1234"; 

    char tmp[NChars] = { 0 }; 
    const char* const sourceAsUTF8 = source.UTF8String; 

    for (size_t idx = 0; idx < NChars; ++idx) { 
     tmp[idx] = sourceAsUTF8[idx]; 
    } 
    /* .. */ 
} 

/* requires error checking */ 
void receive(const char bytes[NChars]) { 
    NSString * result = [[NSString alloc] initWithBytes:bytes length:NChars encoding:NSUTF8StringEncoding]; 
    /* ... */ 
} 
+1

好吧,'-UTF8String'的結果被終止了,但是如果他將它複製到一個緩衝區而不允許終止空間的話,那將會是一個問題。 – 2012-04-23 15:23:37

+1

@DavidGelhar完全(+1)。儘管那*是我在原始答案中指定的緩衝區,但我已經添加了一個更完整的說明來澄清。 – justin 2012-04-23 16:09:43

+0

我仍然無法完成它的工作。我想我錯過了一些超級明顯的東西。我用我的代碼編輯了我的帖子。謝謝您的幫助。 – 2012-04-23 22:31:54

1

一種方法是

char bytes[4]; 

NSData* data = [@"1234" dataUsingEncoding: NSUTF8StringEncoding]; 
if ([data length] <= 4) 
{ 
    memcpy(bytes, [data bytes], [data length]); 
} 

和走另一條路:

NSString* recodedString = [[NSString alloc] initWithBytes: bytes 
                length: savedLengthFromBefore 
               encoding: NSUTF8StringEncoding]; 
1

有幾個可能的陷阱在這裏。

一個是與[NSString UTF8String]"The returned C string is automatically freed just as a returned object would be released; you should copy the C string if it needs to store it outside of the autorelease context in which the C string is created."。所以,這取決於你多久期待值留下來,你可能需要複製它(例如,使用strcpy

的另一個問題是,[NSString UTF8String][NSString stringWithUTF8String:]都期待NULL終止的C字符串,所以你需要一個char [5],而不是char [4]來保存@「1234」。