【问题标题】:read a int from a file wrote by java's writeInt method in C++?从 C++ 中 java 的 writeInt 方法写入的文件中读取一个 int?
【发布时间】:2009-07-23 03:33:03
【问题描述】:

如何去做这件事?另外,有没有简单的方法可以做到这一点?使用 Boost 之类的库?

【问题讨论】:

标签: java c++ int iostream


【解决方案1】:

写出 int 的 DataOutputStream 写出一个 4 字节的 int,高字节在前。读入 char*,重新解释,如果需要转换字节顺序,请使用 ntohl。

ifstream is;
is.open ("test.txt", ios::binary );
char* pBuffer = new char[4];

is.read (pBuffer, 4);
is.close();

int* pInt = reinterpret_cast<int*>(pBuffer);
int myInt = ntohl(*pInt); // This is only required if you are on a little endian box
delete [] pBuffer;

【讨论】:

  • 一切都很好,直到您到达sizeof(int) != 4 的平台。或者整数是一个补码或符号位,而不是二进制补码(ISO C99 都允许)。
  • 在什么平台上整数的补码或符号位?我想知道。
  • @mamin:PDP-1 使用了一个补码,现在仍然存在三个(加上模拟器)。
【解决方案2】:

唯一的跨平台方法是逐字节读取它(即char by char),并从中构建一个整数。您可能想使用long,因为int 不能保证足够宽以容纳32 位值。我假设您已经在这里将字节读入char[4] 数组(其他答案已经展示了如何做到这一点):

char bytes[4];
...
long n = (long(bytes[0]) << 24) | (long(bytes[1]) << 16) |
         (long(bytes[2]) << 8)  |  long(bytes[3])

【讨论】:

    【解决方案3】:

    想法:

    1. 将其作为直接二进制读取,然后根据需要转换/解释字节。因此,如果 Java 为 int 写出 4 个字节,那么您读入 4 个字节。如果有任何字节序要更改,则执行此操作,然后将字节数组转换(或复制)到 c++ int
    2. 如果您可以更改 Java 代码,则可以将其写成 C++ 可以读取的常见内容,例如 UTF-8 文本或 ascii,或者 Google Protocol Buffers 格式或其他格式。

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 2015-07-12
      • 2015-12-29
      • 1970-01-01
      • 2020-05-23
      • 2017-05-03
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      相关资源
      最近更新 更多