为什么以下代码从NSData返回不正确的值?

时间:2013-11-22 02:05:01

标签: ios objective-c nsdata game-center gamekit

我需要通过网络作为NSData发送数据。由于格式只能在运行时确定(例如:消息类型,对象数量等,对象类型),我使用以下代码打包/解压缩NSData

打包:

NSMutableData *data = [NSMutableData dataWithCapacity:0];
unsigned int _state = 66;
[data appendBytes:&state length:sizeof(state)];

解压缩(在其他iOS设备上接收后)

void *buffer = malloc(255);
[data getBytes:buffer length:sizeof(unsigned int)];
unsigned int _state = (unsigned int)buffer;
....

我正在使用缓冲区,因为最终会在NSData中存储许多不同的整数/浮点数等。第一个int可以确定消息的类型,第二个int - 存储的浮点数等等...我使用苹果游戏中心apis发送和接收数据:

- (BOOL)sendData:(NSData *)data toPlayers:(NSArray *)playerIDs withDataMode:(GKMatchSendDataMode)mode error:(NSError **)error
-(void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID

但问题是,当我解压缩单个int时,而不是得到66,我得到一些随机值,如401488960或399903824(每次解压时它都不同,即使我每次发送66个)。 为什么数据不正确?我打开包装不正确吗?

1 个答案:

答案 0 :(得分:2)

您正在将指针buffer强制转换为unsigned int:您将内存地址分配给_state,而不是该地址的值。请改用相应类型的指针(unsigned int *),然后取消引用它:

unsigned int _state = *(unsigned int *)buffer;