java - C 中的 fwrite() 和 Java 中的 readInt() 字节顺序不同

标签 java android c endianness datainputstream

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

0x1b27。但是 readInt() 以大端方式读取数据,而我的 native 编码以小端方式写入数据。 .所以,我得到的不是 0x0000001b 0x1b000000

我的理解对吗?以前有人遇到过这个问题吗?

最佳答案

来自 readInt() 的 Javadoc:

This method is suitable for reading bytes written by the writeInt method of interface DataOutput

如果您想阅读由 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/

相关文章:

在服务器上发送大量请求时出现 java.net.SocketException

java - 如何在 HDInsight 中将外部 jar 添加到 Spark?

java.lang.AssertionError : Status expected:<200> but was:<404> for Spring Boot Rest Controller

Android、IOS 和 phonegap

c - 如何最小化使用的数据空间? (在函数中重新声明一个二维数组)

java - Java 中流关闭模式的变体

java - 如何将字符串中的负值转换为 double

java - 使用 handler.obtainmessage 时出现空指针异常

c - 如何在C中增加具有多线程的结构的值

java - 串联/不间断套接字编程