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