Ios 改为;结构化/序列化数据“;来自NSStream

Ios 改为;结构化/序列化数据“;来自NSStream,ios,objective-c,Ios,Objective C,我正在开发一个游戏应用程序,它将从服务器获取结构化数据,并根据这些数据做出响应 我已通过NSSream将应用程序连接到互联网。具体来说,我遵循的教程。所以我的代码看起来像: - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { switch(eventCode) { case NSStreamEventHasBytesAvailable: {

我正在开发一个游戏应用程序,它将从服务器获取结构化数据,并根据这些数据做出响应

我已通过NSSream将应用程序连接到互联网。具体来说,我遵循的教程。所以我的代码看起来像:

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    switch(eventCode) {
        case NSStreamEventHasBytesAvailable:
        {
            if(!_data) {
                _data = [[NSMutableData data] retain];
            }
            uint8_t buf[1024];
            NSInteger len = 0;
            len = [(NSInputStream *)stream read:buf maxLength:1024];
            if(len) {
                [_data appendBytes:(const void *)buf length:len];
                // bytesRead is an instance variable of type NSNumber.
                [bytesRead setIntValue:[bytesRead intValue]+len];
            } else {
                NSLog(@"no buffer!");
            }
            break;
        }
        // continued
我的问题是:“如果可能,我如何将_数据转换为我想要的格式”。例如,我的服务器将发送两种类型的数据。对于每个数据,第一个字节是数据类型的指示符(例如,1表示数据类型1,2表示数据类型2)。对于数据类型1,发送int(4字节)作为数据本身。对于数据类型2,int(4字节)作为以下字符串字节的大小发送。例如,如果这个int是10,那么服务器将再发送10个字节,以形成客户端的字符串

我的Android(Java)应用程序中的代码如下所示:

// dataIn = new DataInputStream(socket.getInputStream());
private void keepPacketRecving(){ // this will be executed in a separate thread
    while(keepRecvThreadRunning) {
        try {
            byte type;
            type = dataIn.readByte();
            if(type == 1){
                int data = dataIn.readInt();
                getTye1Data(data); // callback function for receiving type 1 data (int)
            } else if (type ==2) {
                int dataSize = dataIn.readInt();
                byte[] buf = new byte[dataSize];
                // ... loop to read enough byte into buf ...
                String data = new String(buf);
                getType2Data(data); // callback function for receiving type 2 data (String)
            }
        }
    }
}
我还注意到,在switch语句中不能有一个while循环来请求inputStream读取更多数据,直到它变长,因为它将挂起线程

我想最好的方法是总是将所有字节追加到_数据中(如示例),并使用另一个函数来解析_数据?然后,问题是如何从数据中窥视字节,然后只提取其中的一部分(例如,从20字节的数据中提取10字节)


Objective-C中有没有像Java中的DataInputStream那样的包装器?

我不明白为什么不能使用与Android代码相同的策略来处理
NSStream
。当您知道数据可用时,您可以提取一个字节并检查它。。。然后根据类型决定要从流中提取多少额外字节。您不必一次从流中读取1024字节。另一种策略是只使用NSStream填充NSData,然后向更高级别的代码发送信号,该代码正在从NSData解析您的结构。嗨,Scott,谢谢您的回复。我不能用android方式,因为我不能在switch语句中“blcok read”。例如,我将再提取5个字节,但NSStream中只有4个可用字节,因此我无法读取(除非我有一种状态机和单独的缓冲区来维护状态)解析NSData现在对我来说似乎是最合理的,但我注意到,由于缺少好的包装器来访问NSData中的字节,所以这样做相对比较困难。例如,我可能只需要NSData中的几个字节(比如获取2~5个字节并将它们视为int)@Yu-Chih您可以直接访问
NSData
字节作为字节数组,并执行您需要的任何访问
memcpy
从需要的偏移量到所需结构的字节数。