簡體   English   中英

將Windows中生成的二進制數據文件轉換為Linux

[英]Convert binary data file generated in windows to linux

我是我的母語FORTRAN程序員,所以我對缺乏C語言知識深表歉意。 我得到了一些要調試的C代碼,該代碼將提取一個二進制文件並將其解析為一個包含我正在使用的Fortran程序的數百條記錄(准確地說是871條)的輸入文件。 問題是這些輸入二進制文件和關聯的C代碼是在Windows環境中創建的。 解析器讀取二進制文件,直到到達文件末尾:

SAGE_Lvl0_Packet GetNextPacket()
{     

   int i;
   SAGE_Lvl0_Packet  inpkt;
   WORD              rdbuf[128]; 
   memset(rdbuf,0,sizeof(rdbuf));
   fprintf(stdout,"Nbytes: %u\n",Nbytes);//returns 224
   if((i = fread(rdbuf,Nbytes,1,Fp)) != 1)
      FileEnd = 1;
   else      
    {         
       if(FileType == 0)
          memcpy(&(inpkt.CCSDS),rdbuf,Nbytes);                 
       else  
          memcpy(&inpkt,rdbuf,Nbytes);
       memcpy(&CurrentPacket,&inpkt,sizeof(inpkt));
    }
    return inpkt;
}

因此,當代碼到達數據包872時,此代碼段應返回FileEnd =1。相反,解析器嘗試從文件末尾(附近)讀取大量數據。 我認為,這將導致程序崩潰(至少在Fortran中會崩潰。c會開始讀取內存的下一部分嗎?)幸運的是,代碼中稍后有一個CRC捕獲了解析器是“讀取正確的數據並正常退出。

我認為問題出在Windows二進制文件中的二進制緩沖區大小和值大於Linux中的二進制緩沖區大小和值。 如果是這樣,是否有簡單的方法可以將Windows的二進制文件轉換為c或Linux版本? 如果我的假設是錯誤的,那么也許我需要多看一些代碼。 順便說一句,一個WORD是一個無符號的short int,一個SAGE_Lvl0_Packet是一個三層結構,共有106個WORD。

我認為這里最大的問題是,當fread()指示文件結束時,將設置FileEnd標志,但是該函數仍然最終返回一個(無效的)清零數據包。 不是一個特別健壯的設計。 我假設調用方在嘗試使用剛剛返回的數據包之前應該檢查FileEnd ,但是由於未顯示,因此很可能是錯誤的假設。

另外,由於不知道數據包的外觀,因此無法判斷各種memcpy()調用是否正確。 要求memcpy()將224個字節復制到一個據說只有212個字節長的結構中的事實是一個很大的問題。

可能還有其他問題,但是這些是我目前看到的大問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM