Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何将uint8[]转换为字符串?_Iphone_Objective C_String_Client Server_Uint - Fatal编程技术网

Iphone 如何将uint8[]转换为字符串?

Iphone 如何将uint8[]转换为字符串?,iphone,objective-c,string,client-server,uint,Iphone,Objective C,String,Client Server,Uint,嗨 我正在做一个iPhone应用程序的工作 我在缓冲区中得到服务器的一些响应,数据类型为Uint8 现在我想用字符串匹配我的缓冲区,有人能告诉我如何检查它吗?给出了一段代码 void receiveData(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) { CFDataRef df = (CFDataRef) data; int len =

嗨 我正在做一个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);
    }
}
void receiveData(CFSocketRef s、CFSocketCallBackType类型、CFDataRef地址、const void*数据、void*信息)
{
CFDataRef df=(CFDataRef)数据;
int len=CFDataGetLength(df);

如果(len出现警告是因为
rangeOfString
NSString
的一种方法,
buffer
不是
NSString
。我认为如果可以将数据转换为NSString会更好。我认为如果尝试使用
stringWithData:

更新


请检查此项

出现警告是因为
rangeOfString
是一种
NSString
方法,
buffer
不是
NSString
。我认为如果您可以将数据转换为NSString会更好。我认为如果您尝试使用
stringWithData:

更新


请检查这个

你在找这个吗

NSString *string = [[NSString alloc]
    initWithData:(id)data
    encoding:NSUTF8StringEncoding];

你在找这个吗

NSString *string = [[NSString alloc]
    initWithData:(id)data
    encoding:NSUTF8StringEncoding];

您的响应可能是
UInt8
,但您不需要将其复制到
UInt8[]
中,因为您已经在
CFDataRef
中找到了它(假设您传入的
void*
确实是
CFDataRef
,如果不是,您还有其他问题…)-a
CFDataRef
NSData
免费桥接(即,您可以从一个转换到另一个),您可以直接从
NSData
中的字节构造
NSString
。您的代码,删除日志记录并添加直接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
意味着数据以null结尾;您可以直接使用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];
}

您的响应可能是
UInt8
,但您不需要将其复制到
UInt8[]
中,因为您已经在
CFDataRef
中找到了它(假设您传入的
void*
确实是
CFDataRef
,如果不是,您还有其他问题…)-a
CFDataRef
NSData
免费桥接(即,您可以从一个转换到另一个),您可以直接从
NSData
中的字节构造
NSString
。您的代码,删除日志记录并添加直接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
意味着数据以null结尾;您可以直接使用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];
}

在这一行“match=[buffer rangeOfString:search];”下面出现警告“无效的接收器类型'Uint8[1]”;在这一行“match=[buffer rangeOfString:search];”下面出现警告“无效的接收器类型'Uint8[1]”thanx回答,你能给我一些细节,如何将uint8转换成字符串吗?如何使用StringWithData:?thanx回答,你能给我一些细节,如何将uint8转换成字符串吗?如何使用StringWithData:?嗯,像这样的东西会感染我想将uint8数组中的数据分配给字符串,但我没有得到它的确切信息你已经在
data
变量中有了数据作为
NSData
,为什么不从中创建字符串呢?啊,哇,我太傻了,为什么我不看数据呢我得到了一些类似于这种感染的东西,我想把Uint8数组中的数据分配给一个字符串,但我没有得到它,因为你已经在
data
变量中有了数据作为
NSData
,为什么你不从中创建字符串呢?啊,哇,我有多愚蠢,为什么我没有看数据?谢谢你,佐尔:)我得到了它