我必须编写代码将big-endian中包含double
值的二进制文件转换为包含little-endian中float
值的第二个文件。
我将任务分成两段,我首先成功完成了endian转换,如下所示。我的第一个问题是:
有时是"分段错误(Core Dumped)"错误即将来临。我不知道为什么,但我设法通过将数组A
的数据类型从int
更改为char
来解决此问题。当我尝试为第二个fopen()
定义另一个文件名时(我想替换" source"使用" destination")发生了同样的错误。当我尝试插入另一个名为C
的数组时,会发生同样的情况。你知道为什么会这样吗?由于这些名字,我发现错误是合乎逻辑的!
我的第二个问题是:我尝试输入A
数组并将数据类型从char
转换为float
,但我没有运气。然后我想到将A
数组再次写入文件并按每64位从新文件中读取。然后我会把这个双(64位)改成浮点数,但我不知道怎么做。可以帮我这个吗?
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *source;
int i;
int size=6000000;
int sof=5960000; // size of file in bytes
char A [size];
char temp [10];
char C [size];
source=fopen("/home/yannis/Endian/TrxVU_9k6.raw","r");
fread(A,sof,1,source);
fclose(source);
printf("\nEvery field of A-array corresponds to %i Byte!\n\n",sizeof(A[0])); // check
for (i=0; i<=size; i+=8) // Endian swap - Data type=Double
{
temp[0]=A[i+7];
temp[1]=A[i+6];
temp[2]=A[i+5];
temp[3]=A[i+4];
A[i+7]=A[i];
A[i+6]=A[i+1];
A[i+5]=A[i+2];
A[i+4]=A[i+3];
A[i+3]=temp[3];
A[i+2]=temp[2];
A[i+1]=temp[1];
A[i]=temp[0];
}
source=fopen("/home/yannis/Endian/Little_TrxVU_9k6.raw","w");
fwrite(A,sof,1,source);
fclose(source);
//source=fopen("/home/yannis/Endian/Little_TrxVU_9k6.raw","r");
//fread(C,1,sof,source);
//fclose(source);
}
答案 0 :(得分:1)
为什么会出现段错误?这一行:
for (i=0; i<=size; i+=8) // Endian swap - Data type=Double
也许你的意思是我&lt;尺寸。使用i&lt; = size,您将最终访问元素A [size] .. A [size + 7],它们位于数组之外,这样做可能会破坏程序的内存。
您通常可以通过在调试器中运行程序来跟踪段错误。这应该告诉你哪个地址导致了段错误,这可以帮助你弄清楚发生了什么。
&#34; sof&#34;之间也存在不匹配。和&#34;尺寸&#34; (不应该是相同的吗?)并且你应该在调用fopen,fread和fwrite之后检查错误,以确保程序真的按照你的预期进行。例如,fread 确实读取了您预期的数据。