Double to Float数组转换和Endian交换

时间:2015-04-24 10:26:27

标签: c arrays

我必须编写代码将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);
}

1 个答案:

答案 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 确实读取了您预期的数据。