내가 FORTRAN의 원시 프로그래머이기 때문에 미리 지식이 부족한 것에 대해 사과드립니다. 나는 바이너리 파일을 인제 스트 (ingest)하는 디버그 용 C 코드를 받았고, 작업중인 Fortran 프로그램을 위해 수백 개의 레코드 (정확하게는 871 개)가 들어있는 입력 파일로 파싱했다. 문제는 이러한 입력 바이너리 및 관련 c 코드가 Windows 환경에서 작성된 것입니다. 코드가 872 패킷을 얻을 때윈도우에서 생성 된 바이너리 데이터 파일을 리눅스로 변환
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;
}
그래서,이 조각은 FileEnd는 = 1. 대신, 파서가 많은 양의 읽기를 시도 반환해야합니다 : 그것은 파일의 끝에 도달 할 때까지 파서 바이너리를 읽고 파일의 끝 (근처)에서 데이터. 이것은 아마도 프로그램이 충돌하게 만들 것입니다 (적어도 Fortran에서는 메모리의 다음 부분을 읽기 시작할 것입니까?) 다행히도 나중에 코드에 CRC가있어 파서가 ' 올바른 데이터를 읽고 정상적으로 종료하십시오.
Windows 바이너리의 바이너리 버퍼 크기와 값이 Linux에서보다 크거나 다른 문제가 있다고 가정합니다. 그렇다면 Windows 나 바이너리를 Linux 나 Linux로 변환하는 쉬운 방법이 있습니까? 내 가정에서 틀렸다면 아마 코드를 좀 더 살펴볼 필요가있을 것이다. BTW, WORD는 부호없는 short int이고 SAGE_Lvl0_Packet은 총 106 개의 WORD가있는 3-tier 구조입니다.
아주 짧게 대답 : feof. – iced