0

structGameCenter の他のプレイヤーにを送信したいです。これに関する他の質問を読みましたが、どれも機能しません。

(ex char[0] = '1'、char[1] = '2' など)に@"1234"入る必要があります。char[4]

試してみ[NSString UTF8String]ましたが、私が望むことをしていないようです。

割り当ては問題ありませんが、 で引き戻すNSString *[NSString stringWithUTF8String:]、空白が返されます。

誰かが私との間の変換を示すことができれば、それは大歓迎です.

ありがとう。

編集:

私はそれを動作させることができません:/これが私のコードです(要約版):

仲人.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

    }
}
4

3 に答える 3

7

渡した cstring が+ [NSString stringWithUTF8String:]終了していないため、試行は失敗します。

これを試して:

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];
    /* ... */
}
于 2012-04-23T15:13:11.400 に答える
1

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];
于 2012-04-23T15:16:48.787 に答える
1

ここにはいくつかの落とし穴があります。

1つは、[NSString UTF8String] 「返されたC文字列は、返されたオブジェクトが解放されるのと同じように自動的に解放されます。C文字列が作成される自動解放コンテキストの外部に格納する必要がある場合は、C文字列をコピーする必要があります。」。したがって、値が保持されると予想される期間によっては、値をコピーする必要がある場合があります(たとえば、を使用してstrcpy

もう1つの問題は[NSString UTF8String][NSString stringWithUTF8String:]どちらもNULLで終了するC文字列を想定しているため、@"1234"を保持するにはchar[4]ではなくchar[5]が必要です。

于 2012-04-23T15:16:56.660 に答える