【发布时间】:2014-12-09 02:29:06
【问题描述】:
我有一个 Java 程序,它使用 ProcessBuilder 启动一个 C++ 程序,并将 C++ 应用程序的输出作为字符串读取。数据是多种数据类型的混合,我通过std::cout 将所有内容序列化为字符串,如下所示:
void write_data(int x) {
std::cout << "int:" << x << std::endl;
}
void write_data(double x) {
std::cout << "double:" << x << std::endl;
}
在 Java 方面,我正在做类似的事情:
String line = readLineFromSubProcess();
String[] parts = line.split(":");
if (parts[0].equals("double")) {
return Double.parseDouble(parts[1]);
}
但是,由于我正在读取传感器数据,因此我担心浮点值会丢失精度。我直接控制序列化格式。
如何将 double 值从 C++ 写入 std::cout,以使从 Java 中读取它会产生完全相同的双精度值?
【问题讨论】:
-
有没有办法以一种完整的方式获取传感器数据?否则以传感器制造商指定的精度(或准确度)对其进行序列化。
-
数据来自一个自定义的内部数据库,有一些应用程序向这个数据库写入双精度数据,我需要将它们读回以发送给第三方监控 Java 程序。我所拥有的就是这个双重价值。到目前为止,我一直在使用幼稚的
std::cout << x方法,因为它很容易在屏幕上为我们阅读。 -
鉴于它们来自序列化源,当您在存储中读取它们时,它们的精度是相同的,然后以相同的精度再次写出。
-
@Niall 我不知道这些值的写入精度,而且我认为这里没有人甚至可以回答这个问题......因为双精度数是 IEEE 754我更多地考虑序列化原始字节,从 Java 读取它们并再次构建原始位。
-
您可以使用带有 jni 接口的 c++ 在 java 中读取您的双打,进行一些预处理并返回到 java 前端。如果您担心格式问题 - 失去精度,那么可能会以二进制格式写入 cout - 例如 uuencode 二进制双精度数据。但我会做一些繁重的测试,以找到失去精度的数据示例。
标签: java c++ c++11 serialization