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