2013-02-02 29 views
2

我有代碼我試圖跨OSX和iOS工作,並遇到文件讀取問題。我正在嘗試在字節級進行文件比較。iOS和OSX之間的文件字符差異

但是,當我在圖像文件中的相同物理偏移處讀取字符時,使用相同的PNG圖像文件作爲測試(其他文件類型的問題相同),我得到的返回的字符不同,具體取決於我是否在iOS物理設備(iPhone)或Mac(此類別的模擬器)。

我寫了一些代碼來讀取同一文件中相同偏移量的字符串來驗證這一點。使用下面的代碼,我每次從相同的參考文件讀取一個字節,以創建一個字符串,然後將其與另一個平臺上先前運行的已知值進行比較。

對於文件內的相同輸入偏移,例如 NSString *definedOffsets = @"49510,37559,13642,49652,19950,21652"; 即使輸入文件是相同的圖像文件,當我在OSX(或iPhone模擬器)上運行代碼與物理iPhone設備時,我也會得到不同的結果。

任何人都可以解釋爲什麼這是,我怎麼可以編碼呢?

- (NSString *) readCharacters:(NSString *) dataline fromSource:(NSString *)datasource 
{ 
    NSString *f=nil; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:datasource]) 
    { 
    NSError *error=nil; 
    //-- Read the image file into an NSData 
    NSData *databuff = [NSData dataWithContentsOfFile:datasource options:NSDataReadingUncached error:&error]; 

    //-- Read the file offsets to compare 
    NSArray *d = [dataline componentsSeparatedByString:@","]; 

    //-- Print Logs of inputs 
    NSLog(@"[readCharacters Offsets]: %@",dataline); 
#ifdef IPHONE_PLATFORM 
    NSLog(@"[readCharacters Offset Count]: %d", d.count); 
#else 
    NSLog(@"[readCharacters Offset Count]: %ld", (unsigned long)d.count); 
#endif 

    //-- Get the characters from file 
    int8_t oneByte; 
    int knum; 
    char na[65]; 
    for (int i=0;i<64;i++) 
    { 
     knum = [[d objectAtIndex:i] intValue]; 
     [databuff getBytes:&oneByte range:NSMakeRange(knum, 1)]; 
     na[i] = oneByte; 
    } 
    na[64]='\0'; 
    f = [NSString stringWithUTF8String:na]; 
    } 
    else{ 
    NSLog(@"Cant Find File"); 
    } 

    //-- Return the String of characters read for later comparison 
    NSLog(@"[Characters]: %@",f); 
    return f; 
} 
+0

那是PNG下載或複製的應用程序的一部分?你說它發生在其他文件類型。它是否發生在純文本文件中? – nschum

+0

有趣的問題。我編輯它以符合一般的堆棧溢出風格,並給我一些標籤,我認爲可能會幫助你獲得更好的答案。如果我歪曲了某些事情,我很抱歉。 –

+0

感謝您的格式幫助。第一個問題發佈.... 是的,該文件是應用程序包(對於這些測試在任何情況下)的一部分,但我在進行比較之前將它從包中複製到文檔中,所以我可以更好地匹配OSX端。沒有嘗試過文本文件,因爲我們使用的大多數文件都是二進制文件。 – Flybar

回答

1

對於iOS應用,Xcode的構建過程將運行pngcrush在PNG文件,以對其進行優化,在設備的圖形卡。這包括插入一個額外的PNG塊,剝離zlib頭和校驗和,從RGB到BGR的字節交換以及預乘alpha值。

嘗試將圖像重命名爲使用「.dat」擴展名並查看是否得到不同的結果。您也可以在目標或項目水平「壓縮PNG文件」打造設置禁用此:

enter image description here

+0

真棒!重新檢查並重建項目。刪除壓縮本身不起作用(稍後會重新檢查),但是使用包中不同擴展名的測試文件首次運行。運氣不好,我選了一個PNG作爲測試文件:-)非常感謝! – Flybar

+0

通過構建設置刪除壓縮可能需要清理構建並從設備或sim首先刪除應用程序。否則舊版本可能不會被覆蓋。 –

相關問題