使用nsmutabledata初始化字符串

时间:2011-09-27 18:20:49

标签: objective-c

我试图将我的数据从套接字检索到nsmutablearray。然而,我发现的示例和教程显示它首先进入字符串。这很好我可以从那里解析出来。但我甚至无法让这个字符串起作用。

    case NSStreamEventHasBytesAvailable:
    {

        if(!rawData) {
            rawData = [[NSMutableData data] retain];
        }
        uint8_t buf[1024];
        unsigned int len = 0;
        len = [(NSInputStream *)theStream read:buf maxLength:1024];
        if(len) {
         [rawData initWithBytes:buf length:len];
            int bytesRead;
            bytesRead += len;

            [self messageReceived:rawData];

        } else {
            NSLog(@"no buffer!");
        }
        NSString *str = [[NSString alloc] initWithData:rawData 
                                              encoding:NSUTF8StringEncoding];
        NSLog(@"data buffer: %@ |~|string buffer%@",rawData,str);


        [str release];
        break;
    }

但正如您将从下面的输出中看到的那样,字符串永远不会获得任何数据(实际上我认为它是编码问题,因此我认为它看起来是空的)

  

2011-09-27 13:14:06.356 Cameleon [30095:207]数据缓冲区:< 0f000102>   |〜|字符串缓冲区

     

2011-09-27 13:14:06.359 Cameleon [30095:207]数据缓冲区:< 02000400   000003> |〜|字符串缓冲区

     

2011-09-27 13:14:06.458 Cameleon [30095:207]数据缓冲区:< 05000500   00020300> |〜|字符串缓冲区

     

2011-09-27 13:14:06.659 Cameleon [30095:207]数据缓冲区:< 05000b00   0008080e 13163809 2711> |〜|字符串缓冲区

     

2011-09-27 13:14:06.663 Cameleon [30095:207]数据缓冲区:< 05000700   00040101 005a> |〜|字符串缓冲区

我希望字符串缓冲区镜像数据缓冲区的值 或者包含数据缓冲区的每个字节的数组

解答:

case NSStreamEventHasBytesAvailable:
        {

            if(!rawData) {
                rawData = [[NSMutableData data] retain];
            }
            uint8_t buf[1024];
            unsigned int len = 0;
            len = [(NSInputStream *)theStream read:buf maxLength:1024];
            if(len) {
             [rawData initWithBytes:buf length:len];                
            } else {
                NSLog(@"no buffer!");
            }

            const uint8_t *bytes = [rawData bytes];

            NSMutableArray *mutableBuffer = [[NSMutableArray alloc] initWithCapacity:len];  

            for (int i =0; i < [rawData length]; i++) {
                [mutableBuffer addObject:[NSString stringWithFormat:@"%02X", bytes[i]]];
            }
            [self gateKeeper:mutableBuffer];


            [mutableBuffer release];
            break;

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题。首先,这不是分配NSData对象的常用模式:

rawData = [[NSMutableData data] retain];

虽然在内存管理方面技术上是正确的,但它不是惯用的,会导致发送不必要的autoreleaseretain条消息。它应该是这样的:

rawData = [[NSMutableData alloc] init];

其次,这段代码没用:

int bytesRead;
bytesRead += len;

你正在声明一个变量,没有初始化它,向它添加len(这在技术上是未定义的行为,但在x86上这将是无害的),然后对它做任何事情。您可能希望使用在此块之外声明的更长寿命的变量并正确初始化它。

最后,问题的实际原因是您收到的数据不是UTF-8文本。它是某种具有嵌入式NUL字符(零字节)的二进制数据。当这些转换为字符串时,NUL会发出字符串终止信号,因此不会打印出任何字符串。

只需将您拥有的数据保存为NSData,如果它实际上不是文本数据,请不要尝试将其转换为字符串。你在处理什么样的数据?它来自哪里?