2017-02-28 45 views
0

我正在做兩個超級老程序代碼A和代碼B的科學項目。兩個代碼之間的交互是通過二進制無格式數據。數據的排列方式是每四個字節組合形成一個浮點數。這兩個程序都是多年前編寫的,開發人員現在都在不同的機構中,很難聯繫。由於我需要緊急查看結果並進行防禦,而且我的編程不太好,所以我使用與開發人員或模塊相同的平臺來編譯和運行這些程序,以避免出現調試問題。代碼A主要用C編寫,其餘部分用bash和FORTRAN編寫。目前還不清楚開發人員在哪個平臺上編寫了這個程序,但我正在使用去年畢業的學生修改後的版本。學生在Windows中修改了64位Cygwin上的程序,發現這是我可以編譯和運行的唯一平臺,沒有錯誤。例如,如果我在OSX,Ubuntu或32位Cygwin上運行它,由於我的編程時間和技能有限,我會遇到超出範圍的錯誤。不同平臺上的二進制無格式數據可能有什麼區別嗎?

代碼B是用C語言編寫的SunOS,並依賴於Sun性能庫。同樣,我只能在我們的計算機實驗室中的古董Solaris機器上成功編譯和運行它。在其他平臺上,我有大量缺失的標題,收集所有這些信息非常麻煩。根據文檔,代碼B使用代碼A的輸出二進制數據,格式的安排方式完全相同。如果我將代碼A的輸出數據複製到代碼B並運行它,代碼B會抱怨數據/ *屏幕輸出的有效性:檢測到負值! * /。儘管如此,如果我使用其目錄中提供的示例數據(即開發人員用於編寫和測試其程序的數據),則代碼B運行時不會出現問題。首先,如果我嘗試只讀取代碼B的數據讀取函數,創建一個簡單的C項目並在我的main()函數中調用它,我發現在我的IDE中我無法重現該BUG。數據在原代碼B讀的算法是這樣的:

int i, nxyz, fildes; 
char msg[1024]; 
nxyz = nx * ny * nz; 
if ((fildes=open(vmfile, O_RDONLY, 0664)) <= 1) 
{ 
    perror(vmfile); 
    return 1; 
} 
if (read(fildes, vmodel, nxyz*sizeof(float)) < 0) 
{ 
    sprintf(msg, "Reading %s\0", vmfile); 
    perror(msg); 
    return 2; 
} 
/* checking validity codes go here */ 
close(fildes); 

的功能是否正確讀我的二進制數據格式化,但無法正確讀取開發者的數據。這與在Solaris上編譯項目時發生的情況相反。其次,我嘗試繞過代碼B的數據讀取功能,編寫一個新函數來通過ASCII文件讀取數據,並確保存儲數據的數組正確地返回到main()函數。進行此修改後,數據正​​確加載但意外加載數據後,程序停止併產生了一個Segmentation Fault,這是使用開發人員的示例數據運行時從未見過的。我不確定我是否應該繼續研究這個新錯誤或放棄這個想法。

那麼,在32位和64位平臺,Linux和Windows,Solaris以及其他Linux機器上的二進制無格式數據之間會有什麼區別嗎?如果有的話,在這種緊急情況下,有沒有辦法在不修改源代碼的情況下轉換數據/ *,因爲它比任何調試都要快得多* /?

回答

0

如果Solaris機器是SPARC,則除非程序都謹慎地按照指定的順序將數據格式化,大於一個字節的數字會存儲順序不同於英特爾CPU在Windows機器上的使用順序。這叫做endianness

浮點數也可以用各種格式編寫,但IEEE floating point standard可能是這裏所用的。當然,如果您想了解這些數據可能會遇到的侷限性和可能的​​錯誤,那麼就有a lot more to know about how floating point numbers are handled

0

不同的平臺可以很容易地爲基礎數據有不同的大小。

已經在32位和64位之間的cygwin上,指針上的數據長度爲 ,長,長雙倍。 嘗試喜歡你的所有不同的平臺之間的這種程序的輸出比較的東西:

$ cat size_of.c 
#include <stdint.h> 
#include <stdio.h> 
#include <math.h> 

int 
main() 
{ 
    printf("sizeof(char) == %d\n", sizeof(char)); 
    printf("sizeof(short) == %d\n", sizeof(short)); 
    printf("sizeof(int) == %d\n", sizeof(int)); 
    printf("sizeof(long) == %d\n", sizeof(long)); 
    printf("sizeof(long long) == %d\n", sizeof(long long)); 
    printf("sizeof(long long int) == %d\n", sizeof(long long int)); 
    printf("sizeof(float) == %d\n", sizeof(float)); 
    printf("sizeof(double) == %d\n", sizeof(double)); 
    printf("sizeof(long double) == %d\n", sizeof(long double)); 
    printf("sizeof(wchar_t) == %d\n", sizeof(wchar_t)); 
    printf("sizeof(u_long) == %d\n", sizeof(u_long)); 
    printf("sizeof(ssize_t) == %d\n", sizeof(ssize_t)); 
    printf("sizeof(size_t) == %d\n", sizeof(size_t)); 
    void *p; 
    printf("sizeof(*void) == %d\n", sizeof(p)); 

    return 0; 
}