2017-07-26 35 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對象嗎? –

相關問題