【发布时间】:2017-04-24 13:35:45
【问题描述】:
本机代码:
使用 fwrite() 写入数字 27。
int main()
{
int a = 27;
FILE *fp;
fp = fopen("/data/tmp.log", "w");
if (!fp)
return -errno;
fwrite(&a, 4, 1, fp);
fclose();
return 0;
}
使用 DataInputStream.readInt() 读回数据(27):
public int readIntDataInputStream(void)
{
String filePath = "/data/tmp.log";
InputStream is = null;
DataInputStream dis = null;
int k;
is = new FileInputStream(filePath);
dis = new DataInputStream(is);
k = dis.readInt();
Log.i(TAG, "Size : " + k);
return 0;
}
O/p
Size : 452984832
嗯,十六进制是0x1b000000
0x1b 是27。但是 readInt() 正在以大端方式读取数据,而我的本机编码正在以小端方式写入。 .所以,我得到的是0x1b000000,而不是0x0000001b。
我的理解正确吗?以前有人遇到过这个问题吗?
【问题讨论】:
-
是的,你是对的。 C 将写入 CPU 的字节序,对于 x86 处理器,它是小字节序。
DataInputStream.readInt()将始终读取大端。解决方案:确定您的文件应该具有哪种字节顺序,并确保两者都相应地采取行动。 -
更重要的是,决定文件应该是big-endian,这使其可移植并且与Java兼容,并相应地调整C代码。在这个 C 代码中你只需要
int a = htonl(27); -
谢谢@Andreas。我有大量的数据要写。我如何在 C 中有效地处理这个问题?
-
@EJP 实际上,我有大量数据要从本机代码写入文件并从 Java 应用程序读取。有推荐的方法吗?
标签: java android c endianness datainputstream