Mac如何读取由旧的SGI680x0 Motorola CPU创建的二进制数据文件?

问题描述

在Mac(因此为64位,小端)中, 我想读取在〜1989 SGI中创建的二进制数据文件 (Irix 3.x,680x0摩托罗拉CPU,因此是32位大端)。

该文件中的数据是使用C代码编写的:

 fwrite(&buf_float,FLOATBYTEBUFSIZE,1,fp_outFile);

在Mac中,我应该使用哪个C代码读取数据?

在Xcode中,我尝试了下面的代码,该代码可以编译但在运行时失败:

#import <CoreFoundation/CoreFoundation.h>
        
CFSwappedFloat32 swappedFloat;
fread(&swappedFloat,sizeof(swappedFloat),ifp);  // Error: "Thread 1: EXC_BAD_ACCESS (code=1,address=0x68)" 
f = CFConvertFloat32SwappedToHost(swappedFloat);

main.c(最低工作代码):

#include <stdio.h>
#include <stdlib.h>
#import <CoreFoundation/CoreFoundation.h>

int main(int argc,const char * argv[]) {
    FILE *ifp;

    printf("\n Opening for reading binary file: %s...",argv[1]);
    ifp = fopen(argv[1],"r");
 
    printf("\n Reading  1st value float...");
    CFSwappedFloat32 swappedFloat;
    fread(&swappedFloat,ifp);  //Thread 1: EXC_BAD_ACCESS (code=1,address=0x68)
    float f = CFConvertFloat32SwappedToHost(swappedFloat);
    printf("\n Read value %f",f);

    fclose(ifp);
    printf("\n DONE.\n");
    return 0;
}

下载测试二进制数据文件“ inFile”(以及可选的最小Xcode项目): https://drive.google.com/drive/folders/1OatRzDrPak2KNRH5ZhrpjP4S3Z9Ps3jY

完整堆栈跟踪:

 Opening for reading binary file: inFile...
 Reading  1st value float...(lldb) bt
* thread #1,queue = 'com.apple.main-thread',stop reason = EXC_BAD_ACCESS (code=1,address=0x68)
    frame #0: 0x00007fff6f3a5a5d libsystem_c.dylib`flockfile + 18
    frame #1: 0x00007fff6f3a76ad libsystem_c.dylib`fread + 31
  * frame #2: 0x0000000100003e3d MWE1`main(argc=2,argv=0x00007ffeefbff540) at main.c:35:5
    frame #3: 0x00007fff6f31dcc9 libdyld.dylib`start + 1
(lldb) 

解决方法

文件指针为空(感谢@kaylum的评论)。那是因为inFile的权限是错误的。我用“ chmod -R 777 ./”修复了它们。该程序现在在Terminal(与gcc一起编译)中运行,并读取float值。它们是否正确,取决于未来几天的3D可视化工作。再次感谢所有发表评论的人!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...