[英]Reading binary files generated on a linux machine on a windows machine
[英]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.