You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objective-C中Socket接收数据无法解码为NSString问题求助

解决Socket数据转NSString失败的问题

嘿,我来帮你排查这个问题~ 你遇到的情况很典型,核心问题出在数据的协议结构和编码解析的匹配度上,咱们一步步拆解:

问题分析

先看你给出的原始十六进制数据:<6d020000 7b225265...>,前4个字节是6d 02 00 00,后面紧跟着的是标准JSON格式的十六进制(比如7b225265对应{"Result")。但你直接转成NSString只得到"m\^B",原因是:

  • 开头的02是ASCII控制字符,UTF-8编码遇到无效/不可解析的字节时会直接截断,所以只解析出了m和那个不可见控制符,后面的JSON完全没被处理。
  • 这4个字节大概率是自定义的协议头(比如包长度标识、协议版本等),不属于有效JSON数据的一部分。

解决方案

1. 先分离协议头与有效数据

跳过前4个字节的协议头,再解析后面的JSON内容,修改后的代码如下:

case NSStreamEventHasBytesAvailable: {
    if(stream == inputStream) {
        NSLog(@"inputStream is ready.");
        uint8_t buf[1024];
        NSInteger len = [inputStream read:buf maxLength:1024];
        if(len > 0) {
            NSMutableData* receivedData = [[NSMutableData alloc] initWithBytes:buf length:len];
            NSLog(@"Raw received data: %@", receivedData);
            
            // 跳过前4字节的协议头,解析后续JSON数据
            if (receivedData.length >= 4) {
                NSData *jsonData = [receivedData subdataWithRange:NSMakeRange(4, receivedData.length - 4)];
                NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
                
                if (jsonString) {
                    NSLog(@"Parsed JSON string: %@", jsonString);
                    [self readIn:jsonString];
                } else {
                    // 尝试ASCII编码兜底(如果JSON是纯ASCII字符的话)
                    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSASCIIStringEncoding];
                    NSLog(@"Parsed with ASCII encoding: %@", jsonString);
                    [self readIn:jsonString];
                }
            } else {
                NSLog(@"Incomplete data received, need more bytes.");
                // 这里可以把receivedData缓存到全局变量,等下次读取到足够数据再处理
            }
        }
    }
    break;
}

2. 处理Socket流式传输的完整性

Socket是流式传输,一次read可能只拿到部分数据包。如果协议头里包含有效数据的长度(比如02 00 00可能是小端序的长度值),你可以先读取头部解析出长度,再循环读取直到拿到完整的JSON数据,避免出现断包解析失败的情况。

验证效果

修改后再运行,你应该能得到完整的JSON字符串,比如:

{"Result":0,"Type":"Fdas.IFAPI.APIAircraftInfo","EngineCount":4,"FlapsConfiguration":[{"FlapsAngle":0,"Name":"0°","ShortName":"0°","SlatsAngle":0},...]}

内容的提问来源于stack exchange,提问作者Sudafly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:31