c - Double 到 Float 数组转换和 Endian 交换

标签 c arrays

我必须编写代码将包含大端字节序的 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/

相关文章:

c++ - 使用公共(public)数据初始化多个 C++ 数组

java - 如何从二维数组中的点开始增加相邻单元格

c - 对数组进行排序 - C 语言

c++ - 三元搜索以在数组中找到差异最小的点

c - 如何将整数数组从 matlab 传递到 mex?

c - 如何正确地将行附加到现有文件

C — 使用 chdir() 函数

c - 奇怪的控制流程顺序

为 HP 瘦客户机编译自定义内核并使用 grub 创建可引导 ISO

c - 为什么这个堆栈程序在使用 POP 时给出垃圾值?