Ios 从URL读取字节,并将二进制转换为正常小数。Obj-C

Ios 从URL读取字节,并将二进制转换为正常小数。Obj-C,ios,iphone,objective-c,ipad,Ios,Iphone,Objective C,Ipad,我在指定的URL上有一个文件(没有扩展名) 我希望能够从这个文件中读取每个单独的字节,并将其二进制编码转换为普通的人类可读的十进制 例如: 从URL>读取文件->将其加载到缓冲区->读取字节数20(例如)->将其值转换为十进制/整数,我可以从那里继续处理。(显示在标签上等) 现在,我只能在文件是本地文件时(使用NSFileHandle)读取该文件,但由于该文件会更改,并且通常必须从URL读取,因此必须有一种方法从URL加载该文件 非常感谢 //ifraaank有几种方法可供您从URL读取资源。在

我在指定的URL上有一个文件(没有扩展名)

我希望能够从这个文件中读取每个单独的字节,并将其二进制编码转换为普通的人类可读的十进制

例如:

URL>读取文件->将其加载到缓冲区->读取字节数20(例如)->将其值转换为十进制/整数,我可以从那里继续处理。(显示在标签上等)

现在,我只能在文件是本地文件时(使用
NSFileHandle
)读取该文件,但由于该文件会更改,并且通常必须从URL读取,因此必须有一种方法从URL加载该文件

非常感谢


//ifraaank

有几种方法可供您从URL读取资源。在iOS7之前,您可以使用NSURLConnection。这是一个例子

    NSURL *URL = [NSURL URLWithString:@"http://file.com/xxxx"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue mainQueue] 
             completionHandler:^(NSURLResponse *response, NSData *data, NSError 
                                 *connectionError) {
        if ( !connectionError ){
            //transfer the NSData into what you need
        }else{
            UIAlertView *alert = [UIAlertView alloc]initWithTitle:@"Error"....
        }
    }];
    NSURL *URL = [NSURL URLWithString:@"http://file.com/xxx"];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:
                          [NSURLSessionConfiguration defaultSessionConfiguration]];
    NSURLSessionTask  *task = [session downloadTaskWithURL:URL 
       completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
        if ( !error){
            NSData *data = [NSData dataWithContentsOfURL: location];
            //transfer the NSData into what you need
        }
    }];
    [task resume];
在iOS7之后,您还可以使用NSURLSession,下面是一个示例

    NSURL *URL = [NSURL URLWithString:@"http://file.com/xxxx"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue mainQueue] 
             completionHandler:^(NSURLResponse *response, NSData *data, NSError 
                                 *connectionError) {
        if ( !connectionError ){
            //transfer the NSData into what you need
        }else{
            UIAlertView *alert = [UIAlertView alloc]initWithTitle:@"Error"....
        }
    }];
    NSURL *URL = [NSURL URLWithString:@"http://file.com/xxx"];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:
                          [NSURLSessionConfiguration defaultSessionConfiguration]];
    NSURLSessionTask  *task = [session downloadTaskWithURL:URL 
       completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
        if ( !error){
            NSData *data = [NSData dataWithContentsOfURL: location];
            //transfer the NSData into what you need
        }
    }];
    [task resume];
希望这有帮助

编辑: 如果要从NSData中读取字节。您可以作为示例来执行

    Byte buffer[20];
    int bufferLength = 20;
    for ( int i= 0; i < [data length] ; i=i+20){
        memset(&buffer, 0, 20);
        //check the buffer length exceed the end of NSData
        bufferLength = (bufferLength >  [data length]-i)?(bufferLength = [data length]-i):bufferLength;
        [data getBytes:&buffer range:NSMakeRange(i, bufferLength)];
        //perform the buffer, it's a Byte[20]
    }
字节缓冲区[20];
int bufferLength=20;
对于(int i=0;i<[数据长度];i=i+20){
memset(和缓冲区,0,20);
//检查缓冲区长度是否超过NSData的结尾
bufferLength=(bufferLength>[数据长度]-i)?(bufferLength=[数据长度]-i):bufferLength;
[data getBytes:&缓冲区范围:nsMakerRange(i,缓冲区长度)];
//执行缓冲区,它是一个字节[20]
}

要加载远程文件,您需要查看
NSURLConnection
。您不需要将字节转换为十进制,只需将其显示为十进制,或生成字符串:

printf("%d", (int)theByte);


需要注意的一点是,一个字节没有等价的
%d
,因此您需要小心,不要最终显示16位整数而不是8位整数。

谢谢。然后如何/在何处指定要读取的文件字节?假设我想用上面的iOS 7示例读取字节20。我只是添加了另一个缓冲区示例供您参考。看起来这是可行的。它将文件加载到缓冲区,但读取字节似乎不起作用。它吐出一个数字,我知道这个数字不正确。(我知道字节的原始值)。我需要读取字节号20,仅1字节长。它应该在二进制状态下读取,然后转换,或者至少输出一个正常的数字,比如89。再次感谢。谢谢你的帮助。我设法用subdataWithRange完成了它,它用十六进制格式的NSLog输出。现在我只需要知道如何将十六进制转换成标签。。。