当前位置: 技术问答>linux和unix
高手快来帮我!UNIX下的二进制文件的问题
来源: 互联网 发布时间:2015-07-13
本文导语: 小第未用过UNIX,这方面知识几乎为0,想请教一个问题。 在UNIX下创建的二进制文件,在WINDOWS下能直接读出来吗?是否要经过某种转换? (小弟是在帮研究所搞一个多波束的项目): 例如在UNIX下创建一个二进制文件...
小第未用过UNIX,这方面知识几乎为0,想请教一个问题。
在UNIX下创建的二进制文件,在WINDOWS下能直接读出来吗?是否要经过某种转换?
(小弟是在帮研究所搞一个多波束的项目):
例如在UNIX下创建一个二进制文件:abc,
unsigned long int date=20021120:
把date写入abc,h是文件的句柄
filewrite(h,&date,4);
现在要在WINDOWS下从abc读出这个date,
unsigned long int date=0:
fileread(h,&date,4);
输出date,发现date=2155819265,
这是怎么回事呢?是不是不同的操作系统的数据存储方式不一样呢?
我这里没有UNXI 的机器,也不懂UNIX编程,
没法亲自试一试,请大家指点
在UNIX下创建的二进制文件,在WINDOWS下能直接读出来吗?是否要经过某种转换?
(小弟是在帮研究所搞一个多波束的项目):
例如在UNIX下创建一个二进制文件:abc,
unsigned long int date=20021120:
把date写入abc,h是文件的句柄
filewrite(h,&date,4);
现在要在WINDOWS下从abc读出这个date,
unsigned long int date=0:
fileread(h,&date,4);
输出date,发现date=2155819265,
这是怎么回事呢?是不是不同的操作系统的数据存储方式不一样呢?
我这里没有UNXI 的机器,也不懂UNIX编程,
没法亲自试一试,请大家指点
|
你所说的UNIX是AIX吧?AIX系统是低字节在前,高字节在后,与X86的系统相反。
20021120=0X01317F80,把高低字节调换就是0X807F3101=2155819265。所以你得在写文件或者读文件时先做一次高低字节调换。
20021120=0X01317F80,把高低字节调换就是0X807F3101=2155819265。所以你得在写文件或者读文件时先做一次高低字节调换。
|
1、是字节序问题。big-endian和little-endian
2、你的转换方法里d和date必须是char*才对。对C的指针加法理解不深。
3、你的方法移植性不好。用byteorder系列函数:htonl等。
2、你的转换方法里d和date必须是char*才对。对C的指针加法理解不深。
3、你的方法移植性不好。用byteorder系列函数:htonl等。
|
这个和CPU架构有关吧?Intel 86系列的long型在内存存储0x12345678整数的顺序是:
78 56 34 12
偶没有接触过其他CPU,所以不知道在其他CPU架构上是什么样子。C运行库函数fread只不过简单的把一块内存地址写入文件,不会考虑什么类型的。
如果你的文件是用运行在Intel 86系列上的unix创建的,那么用Windows读出来应该是一样。我在FreeeBSD创建的文件在Windows读出来的结果是一致的。
void test_fread()
{
FILE* fp;
long n;
n = 0;
fp = fopen("testfile", "rb");
fread(&n, sizeof(long), 1, fp);
fclose(fp);
printf("n = %d (0x%x)n", n, n);
}
void test_fwrite()
{
FILE* fp;
long n;
n = 0x12345678;
fp = fopen("testfile", "wb");
fwrite(&n, sizeof(long), 1, fp);
fclose(fp);
}
78 56 34 12
偶没有接触过其他CPU,所以不知道在其他CPU架构上是什么样子。C运行库函数fread只不过简单的把一块内存地址写入文件,不会考虑什么类型的。
如果你的文件是用运行在Intel 86系列上的unix创建的,那么用Windows读出来应该是一样。我在FreeeBSD创建的文件在Windows读出来的结果是一致的。
void test_fread()
{
FILE* fp;
long n;
n = 0;
fp = fopen("testfile", "rb");
fread(&n, sizeof(long), 1, fp);
fclose(fp);
printf("n = %d (0x%x)n", n, n);
}
void test_fwrite()
{
FILE* fp;
long n;
n = 0x12345678;
fp = fopen("testfile", "wb");
fwrite(&n, sizeof(long), 1, fp);
fclose(fp);
}