我试图将我的数据从套接字检索到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;
答案 0 :(得分:0)
您的代码有几个问题。首先,这不是分配NSData
对象的常用模式:
rawData = [[NSMutableData data] retain];
虽然在内存管理方面技术上是正确的,但它不是惯用的,会导致发送不必要的autorelease
和retain
条消息。它应该是这样的:
rawData = [[NSMutableData alloc] init];
其次,这段代码没用:
int bytesRead;
bytesRead += len;
你正在声明一个变量,没有初始化它,向它添加len
(这在技术上是未定义的行为,但在x86上这将是无害的),然后对它做任何事情。您可能希望使用在此块之外声明的更长寿命的变量并正确初始化它。
最后,问题的实际原因是您收到的数据不是UTF-8文本。它是某种具有嵌入式NUL字符(零字节)的二进制数据。当这些转换为字符串时,NUL会发出字符串终止信号,因此不会打印出任何字符串。
只需将您拥有的数据保存为NSData
,如果它实际上不是文本数据,请不要尝试将其转换为字符串。你在处理什么样的数据?它来自哪里?