我必须编写代码将包含大端字节序的 double 值的二进制文件转换为包含小端字节序的浮点值的第二个文件。
我将任务分成两段,首先成功完成了字节序转换,如下所示。我的第一个问题是:
有时会出现“段错误(核心转储)”错误。我不知道为什么,但我设法通过将数组
A
的数据类型从int
更改为char
来解决它。当我尝试为第二个fopen()
定义另一个文件名(我想用“目标”替换“源”)时,发生了相同的错误。当我尝试插入另一个名为C
的数组时,也会发生同样的情况。你知道为什么会发生这种情况吗?我觉得因为名字而出现错误是不合逻辑的!我的第二个问题是:我尝试对
A
数组进行类型转换,并将数据类型从char
转换为float
,但我没有运气。然后我想到再次将A
数组写入文件中,并按 64 位从新文件中读取。然后我会将这个 double (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);
}
最佳答案
为什么会出现段错误?这一行:
for (i=0; i<=size; i+=8) // Endian swap - Data type=Double
也许你的意思是我<尺寸。当 i <= size 时,您最终将访问数组外部的元素 A[size] .. A[size + 7],这样做可能会损坏程序的内存。
您通常可以通过在调试器中运行程序来跟踪段错误。这应该告诉您哪个地址导致了段错误,这可以帮助您弄清楚发生了什么。
“sof”和“size”之间也存在不匹配(它们不应该相同吗?),您应该在调用 fopen、fread 和 fwrite 后真正检查错误,以确保程序确实做了你所期望的。例如,fread 是否真的读取了您预期的那么多数据。
关于c - Double 到 Float 数组转换和 Endian 交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29845053/