如何在uint64_t上存储结构信息以应对游戏中心挑战



我正在尝试在GKScore的uint64_t上下文属性上存储一些与游戏相关的信息 - 通过新的游戏中心挑战创造更好的游戏体验。但是,我做得不对。我构建了一个如下所示的结构:

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 个变量。

我做错了什么?有没有更聪明的方法可以做到这一点?

您正在尝试将96位数据(iOS/ARM上的3 unsigned int秒)打包到64位容器中。因此,您会看到前两个 32 位值,而不是第三个。

也许您可以尝试使用 short s 或 char s,具体取决于结构将包含的值范围,并尝试将 stuct 的大小减小到 <64 位。我认为 ARM 上的 3 char将对齐到 48 位(如果是这样,请告诉我!所以也许无论如何都要使用short

编辑:更改结构的可能方法示例,假设您只在每个字段中存储 16 位值:

typedef struct{
    uint16_t gameMode;
    uint16_t destroyed;
    uint16_t duration;
} GameInfo;

最新更新