native 代码:
使用 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;
}
对/对
Size : 452984832
嗯,十六进制是 0x1b000000
0x1b
是 27
。但是 readInt() 以大端方式读取数据,而我的 native 编码以小端方式写入数据。 .所以,我得到的不是 0x0000001b
0x1b000000
。
我的理解对吗?以前有人遇到过这个问题吗?
最佳答案
来自 readInt()
的 Javadoc:
This method is suitable for reading bytes written by the
writeInt
method of interfaceDataOutput
如果您想阅读由 C 程序编写的内容,您必须自己使用 java.nio
中的工具进行字节交换。我从未这样做过,但我相信您会将数据读入 ByteBuffer
,将缓冲区的顺序设置为 ByteOrder.LITTLE_ENDIAN
,然后创建一个 IntBuffer
查看 ByteBuffer
如果您有值数组,或者只使用 ByteBuffer#getInt()
获取单个值。
除此之外,我同意@EJP 的观点,即数据的外部格式应该是 big-endian 以获得最大的兼容性。
关于java - C 中的 fwrite() 和 Java 中的 readInt() 字节顺序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41054223/