gpt4 book ai didi

将windows生成的二进制数据文件转换成linux

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:36 28 4
gpt4 key购买 nike

对于我缺乏 C 语言知识,我提前表示歉意,因为我是一名原生 FORTRAN 程序员。我得到了一些要调试的 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 可以捕获解析器' t 读取正确的数据并优雅地退出。

我假设问题源于 Windows 二进制文件中的二进制缓冲区大小和值比 Linux 中的更大/不同。如果是这样,是否有一种简单的方法可以在 c 或 Linux 中将 Windows 的二进制文件转换为 Linux?如果我的假设是错误的,那么也许我需要再查看一下代码。顺便说一句,一个WORD是一个unsigned short int,一个SAGE_Lvl0_Packet是一个三层结构,共有106个WORD。

最佳答案

我认为这里最大的问题是,当 fread() 指示文件结束时,FileEnd 标志被设置,但函数最终仍然返回一个 (无效)清零数据包。不是特别坚固的设计。我假设调用方在尝试使用刚刚返回的数据包之前应该检查 FileEnd,但由于未显示,这很可能是错误的假设。

此外,不知道数据包是什么样子,就不可能判断各种 memcpy() 调用是否正确。事实上,memcpy() 被要求将 224 字节复制到一个据称只有 212 字节长的结构中,这是一个非常有问题的问题。

可能还有其他问题,但这些是我目前看到的主要问题。

关于将windows生成的二进制数据文件转换成linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519905/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com