【发布时间】:2011-05-17 20:21:52
【问题描述】:
大家好。所以这里是交易。我有一个 Java 程序运行一个 C++ 程序。 C++ 进程通过简单地在 std::cout 上调用 write 和一些指针转换来向 Java 程序发送一些双精度值。 Java 程序使用 Process 的 getInputStream(),读取 8 个字节并使用一些字节移位和 Double.longBitsToDouble() 将它们转换为双精度。我已确保两个应用程序之间的类型大小和字节顺序匹配。现在,虽然这在大多数情况下都有效,但每隔一段时间就会发生错误。
我已将其中一个错误隔离为一个我似乎无法正确传输的简单字节序列。查看以下 sn-ps:
#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()
}
还有 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()) + " ");
}
}
这些是非常简单的示例,但它们用于演示我的问题。当我在我的 Windows 7 机器上运行它时。我得到以下 Java 输出:
b6 e1 d a b9 98 e3 48
预期的输出是
b6 e1 a b9 98 e3 48 40
不知何故,插入了一个额外的 0x0d 字节。然而,真正奇怪的是,如果在 java 应用程序中我们再读取一个字节(将 8 更改为 9),我们会得到
b6 e1 d a b9 98 e3 48 40
这意味着 InputStream 实际上包含 9 个字节的数据,一旦删除了额外的 0x0d,它就包含正确的数据。
你们怎么看?正如我之前提到的,这种情况并不经常发生,但一旦发生,那就是灾难性的。
提前致谢, 曾基克
【问题讨论】:
标签: java c++ inputstream