微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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可视化工作。再次感谢所有发表评论的人!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。