Java Process InputStream错误?

zie*_*ikk 2 c++ java inputstream

大家好.所以这里是交易.我有一个Java程序运行C++程序.C++进程通过简单地使用一些指针转换调用std :: cout上的write来向Java程序发送一些双精度数.Java程序使用Process的getInputStream(),读取8个字节,并使用一些字节移位和Double.longBitsToDouble()将它们转换为double.我确保两个应用程序之间的类型大小和字节顺序匹配.现在,虽然这在大多数情况下都有效,但每次都会发生错误.

我已将其中一个错误隔离到一个简单的字节序列,我似乎无法正确传输.请查看以下代码段:

#include <iostream>

int main(int argc, char** argv) {
  long long l = 0x4048e398b90ae1b6;
  char* ptr = (char*) &l;
  std::cout.write(ptr, 8);
  std::cout.flush();


  //  for (int i = 0; i < 8; ++i)
  //    std::cout.put(ptr[i]);
  //  std::cout.flush()
}
Run Code Online (Sandbox Code Playgroud)

和Java应用程序:

public static void main(String[] argv) throws IOException {
  Process p = Runtime.getRuntime().exec("prog.exe");
  InputStream is = p.getInputStream();

  for (int i = 0 ; i < 8; ++i) {
    System.err.print(Long.toHexString(is.read()) + " ");
  }
}
Run Code Online (Sandbox Code Playgroud)

这些是非常简单的示例,但它们用于演示我的问题.当我在Windows 7机器上运行它时.我得到以下Java输出:

b6 e1 d a b9 98 e3 48
Run Code Online (Sandbox Code Playgroud)

预期的产出是

b6 e1 a b9 98 e3 48 40
Run Code Online (Sandbox Code Playgroud)

不知何故,插入了额外的0x0d字节.然而,真正奇怪的是,如果在java应用程序中我们再读取一个字节(将8更改为9),我们得到

b6 e1 d a b9 98 e3 48 40 
Run Code Online (Sandbox Code Playgroud)

这意味着InputStream实际上包含9个字节的数据,一旦删除了额外的0x0d,它就包含正确的数据.

你们有什么感想?正如我之前提到的,这不会经常发生,但是当它发生时,它是灾难性的.

先谢谢,zienkikk

Ste*_*end 6

cout默认情况下,在文本模式下打开,我想说的是0xa(换行)字符<CRLF>在输出预处理期间转换为序列.

我认为可靠地写二进制数据是不可能的cout(例如参见这里),因此我将所需的输出转换为文本,然后在输入端(Java)进行反序列化.