0

ゲーム関連の情報を GKScore の uint64_t コンテキスト プロパティに保存して、新しい Game Center Challenges でより良いゲーム体験を作成しようとしています。しかし、私はそれを正しく理解していません。以下のような構造体を作成しました。

typedef struct{
    unsigned int gameMode;
    unsigned int destroyed;
    unsigned int duration;
} GameInfo;

私は次のことを試します:

uint64_t myContext

GameInfo info;
info.gameMode = 2;
info.destroyed = 50;
info.duration = 100;

NSData *data = [NSData dataWithBytes:&info length:sizeof(info)];
[data getBytes:&myContext length:sizeof(myContext)];

構造体を NSData にパックしてから、バイトを myContext に書き込みます。

次に、次のように 64 ビット整数を使用して情報を再作成しようとします。

NSData *newData = [NSData dataWithBytes:&myContext length:sizeof(myContext)];

GameInfo *result = (GameInfo*) [newData bytes];

ただし、値をログアウトすると、最初の 2 つの値 (gameMode と destroy) しか取得できないことがわかります。構造体にさらに変数を追加しても、最初の 2 つの変数のみをキャプチャします。

私は何を間違っていますか?これを行うよりスマートな方法はありますか?

4

1 に答える 1

2

96 ビットのデータ ( unsigned intiOS/ARM では 3 秒) を 64 ビット コンテナーにパックしようとしています。したがって、最初の 2 つの 32 ビット値が表示され、3 番目の値は表示されません。

おそらく、構造体が保持する値の範囲に応じてshorts またはchars を使用して、構造体のサイズを 64 ビット未満に抑えることができます。ARM の3 は 48 ビットに揃えられると思いcharます (間違っている場合はお知らせください!)。だから多分shortとにかく使う。

編集:各フィールドに16ビット値のみを格納すると仮定して、構造体を変更する可能な方法の例:

typedef struct{
    uint16_t gameMode;
    uint16_t destroyed;
    uint16_t duration;
} GameInfo;
于 2012-09-29T17:43:07.467 に答える