我正在尝试在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];
但是,当我注销这些值时,我发现我只能捕获前两个值(gameMode并销毁)。如果我在结构中添加更多变量,我仍然只捕获前两个变量。
我做错了什么?有更聪明的方法吗?
答案 0 :(得分:2)
您正尝试将96位数据(iOS / ARM上的3 unsigned int
)打包到64位容器中。所以你看到前两个32位值,而不是第三个。
也许您可以尝试使用short
或char
s,具体取决于您的结构所持有的值的范围,并尝试将结构的大小降低到< 1。 64位。我认为ARM上的3 char
将对齐到48位(如果是这样可能是错误的,请告诉我!)。所以也许可以使用short
。
编辑:更改结构的可能方法示例,假设您只在每个字段中存储16位值:
typedef struct{
uint16_t gameMode;
uint16_t destroyed;
uint16_t duration;
} GameInfo;