您好 我正在开发iPhone应用程序 我在数据类型为Uint8的缓冲区中收到服务器的响应 现在我想将我的缓冲区与字符串匹配,任何身体都可以告诉我如何检查它?给出了一段代码
void receiveData(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
CFDataRef df = (CFDataRef) data;
int len = CFDataGetLength(df);
if(len <= 0) return;
CFRange range = CFRangeMake(0,len);
UInt8 buffer[len];
NSLog(@"Received %d bytes from socket %d\n",
len, CFSocketGetNative(s));
CFDataGetBytes(df, range, buffer);
NSLog(@"Client received: %s\n", buffer);
NSLog(@"As UInt8 coding: %@", df);
[mTextViewAlias setText:[NSString stringWithUTF8String: buffer]];
////////////.............////////////
LoginViewController *lvc = [[LoginViewController alloc] init];
NSString *search = @"ACPT";
NSRange match;
match = [buffer rangeOfString: search];
if (match.location == NSNotFound)
NSLog (@"Invalid Username Or Password");
else
{
[lvc goToWatchList];
NSLog (@"match found at index %i", match.location);
}
}
任何人都有一些想法吗? 我会非常感激
答案 0 :(得分:2)
您的回复可能是UInt8
,但您无需将其复制到UInt8[]
,因为您已在CFDataRef
中将其复制(假设您已通过void *
真的是一个CFDataRef
,如果不是你有其他问题...) - CFDataRef
与NSData
免费联系(即你可以从一个转换为另一个),您可以直接从NSString
中的字节构造NSData
。您的代码,删除日志记录并添加直接NSString转换:
void receiveData(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
LoginViewController *lvc = [[LoginViewController alloc] init];
NSString *buffer = [[NSString alloc] initWithData:(NSData *)data
encoding:NSUTF8StringEncoding];
NSRange match = [buffer rangeOfString:@"ACPT"];
[buffer release];
if (match.location == NSNotFound)
NSLog (@"Invalid Username Or Password");
else
[lvc goToWatchList];
}
或者,至少在您的示例代码中:不保存转换后的缓冲区,使用文字字符串进行搜索,而使用%s
表示数据以空值终止;您可以直接使用C函数完成所有这些操作,而无需创建中间对象:
void receiveData(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
LoginViewController *lvc = [[LoginViewController alloc] init];
char *buffer = (char *)CFDataGetBytePtr((CFDataRef)data);
if (strstr(buffer, "ACPT") == NULL)
NSLog (@"Invalid Username Or Password");
else
[lvc goToWatchList];
}
答案 1 :(得分:1)
你在找这个吗?
NSString *string = [[NSString alloc]
initWithData:(id)data
encoding:NSUTF8StringEncoding];
答案 2 :(得分:0)
出现警告,因为rangeOfString
是NSString
的方法而buffer
不是NSString
。我认为如果你可以将数据转换为NSString会更好。我认为如果您尝试使用stringWithData:
<强>更新强>
请检查此Link