2017-07-26 37 views
0

我有一个二进制文件,我试图把内容放入一个数组,以模拟一个XMLHTTPRequest,它将读取和返回二进制数据。我已经尝试了类似的其他帖子,这是我想出的代码。我不知道为什么我不能打印出阵列。更好的方式来获得类似于下面的函数的结果也将高度赞赏。如何将字节的NSData转换为NSArray并打印内容?避免Javascript XMLHTTPRequest

NSString *str0=[[NSBundle mainBundle] pathForResource:@"exec" ofType:nil]; 
NSData* data0 = [NSData dataWithContentsOfFile:str0]; 
NSArray* array = [NSKeyedUnarchiver unarchiveObjectWithData:data0]; 
NSUInteger len= [data0 length]; 
Byte *byteData = (Byte*)malloc(len); 
memcpy(byteData, [data0 bytes], len); 
NSLog(@"THIS IS THE exec %b",byteData); 

我试图达到同样的效果,这个JavaScript将返回在客观C:

function load_binary_resource(url) { 
var req = new XMLHttpRequest(); 
req.open('GET', url, false); 
req.overrideMimeType('text\/plain; charset=x-user-defined'); 
req.send(null); 
if (req.status != 200) { 
    document.write("fail downloading loader"); 
    stop = 1 
}; 
return req.responseText; 

}

+0

你是什么意思的“二进制数据”?期望结果是数组的字符串元素还是'ArrayBuffer'? – guest271314

回答

0

我不知道为什么我不能打印出阵列。

当你编译你的代码时,你是否读过警告?你得到的第一个警告告诉你array未被使用。第二个警告是重要的,对于行:

NSLog(@"THIS IS THE exec %b",byteData); 

你得到警告:

Invalid conversion specifier 'b' 

没有%b格式,你在哪里大概猜测是Byte。您需要阅读String Format Specifiers。对于那里你会发现Byte没有格式,但%02x将格式化一个整数作为2个十六进制数字,如果需要前导零。你可以用它来输出Byte,例如:

Byte b = 0x42; 
NSLog(@"b = %2x", b); 

将输出一个Byte值,但没有格式输出的Byte秒的阵列。为此,您必须编写一个合适的循环,并根据您的选择逐个输出Byte,例如每行8个逗号(例如,运行逗号)。

我试图达到同样的效果,因为这将JavaScript的在目标C

返回嗯,你的代码没有做到这一点了,但是那是密切。第1-2行以原始字节读入文件,并将它们存储为NSData值。虽然第4-6行会产生一个malloc()'c编码的字节数组,这个数组的值是NSData的值(后面必须是free(),否则会产生内存泄漏)。

JavaScript将原始字节作为字符串返回,而不根据任何编码(ASCII,UTF-8等)解释它们。您的NSData值包含那些原始字节,可能是Objective-C中使用的合适类型。 NSString不是一个好的选择,因为它将根据字符编码解释字节。但是,如果添加了尾随的NULL字节,则您的C风格字节数组将被视为C风格的字符串。请记住,如果你是C阵列/字符串,你需要free()以及不再需要时。

HTH

+0

哦,是的,我忘了注释掉b,但即使取出b导致“错误的接收器类型'字节'”我怎么能打印出byte * byteData数组,我可以循环NSData对象,因为我可以NSArray? –

+0

“取出b”没有格式说明符,所以当然你会出错。按照答案打印出C字节数组。你可以访问'NSData'中的单个字节,阅读可用方法的文档。如果你愿意,你可以创建一个'NSArray',但是因为它们只能包含对象,而不是基本的值,所以你需要使用'NSValue'或'NSNumber'来包装每个字节。在猜测使用“NSArray”可能不是你的最佳选择,“NSData”可能更好。 – CRD

+0

好吧,我结束了创建一个十六进制值的字符串,所以基本上现在我有一个字符串具有相同的十六进制字节,我的NSData所以现在我要尝试循环通过空格分割十六进制字节的字符串和将每个“字符串”放入一个数组中,因为这是假设与一段JavaScript的结合使用,这个javascript期望得到与原始load_binary_resource相同的输出。我不认为它会工作,如果我把它的NSData对象吗? –

相关问题