Java和C#中双值的低级实现

Posted

技术标签:

【中文标题】Java和C#中双值的低级实现【英文标题】:Low-level implementation of double value in Java and C# 【发布时间】:2012-10-14 08:40:55 【问题描述】:

我面临一个棘手的问题。我想通过 C# 从 sqlite 数据库中读取数据。数据库中的数据字段具有一种 blob 类型。该字段包含由 Java 编写的 double 值(也有其他类型的值,例如 text 和 int)。我需要用 C# 读取双精度值。

很抱歉,我在这个问题上犯了一个严重的错误。我通过创建一个由从数据库读取的 blob 流初始化的 ByteBuffer 来读取 Java 中的双精度值。并且 C# 中没有对应的 ByteBuffer 数据结构,所以我使用下面的代码从 8 字节流中获取双精度值。

public double getDouble()

    if(CURRENT_POSITION + 7 >= CURRENT_LENGTH)
    
        return 0;
    
    double ret = (double)(TEMP_BYTE_ARRAY[CURRENT_POSITION + 7] << 56 |
                          TEMP_BYTE_ARRAY[CURRENT_POSITION + 6] << 48 |
                          TEMP_BYTE_ARRAY[CURRENT_POSITION + 5] << 40 |
    .....
    );
    return ret;

但我无法通过 C# 使用相同的代码从 blob 字段中获取正确的双精度值。谁能给我一些关于如何将Java定义的二进制样式双值转换为C#双值的建议?

顺便说一句,由于 blob 字段压缩了很多其他类型的值,我无法更改数据库的结构。提前谢谢大家。

【问题讨论】:

您确定这是您想要的 Java 端代码吗?这总是会给出一个整数...... @JonSkeet 嗨,乔恩,感谢您的评论,我已经编辑了问题,您能帮帮我吗? 这仍然不会产生任何非整数值......如果你期望它,你真的需要看看你在做什么...... 也许您应该从数据库中发布一个示例值以及我们应该期望从中读取什么值? 【参考方案1】:

使用BitConverter:

double ret = BitConverter.ToDouble(TEMP_BYTE_ARRAY, CURRENT_POSITION); 

您发布的代码只是创建一个整数并将整数转换为双精度数,这不是您想要的。

Alternitavely,您可以通过在MemoryStream 上创建BinaryReader 来获得与ByteBuffer 相同的功能。例如:

MemoryStream memStream = new MemoryStream(TEMP_BYTE_ARRAY);
BinaryReader reader = new BinaryReader(memStream);

//read data
double a = reader.ReadDouble();
int b = reader.ReadInt();
string c = reader.ReadString();

【讨论】:

以上是关于Java和C#中双值的低级实现的主要内容,如果未能解决你的问题,请参考以下文章

Java中双基准快速排序方法(DualPivotQuicksort.sort())的具体实现

Razor Pages 中具有双值的输入字段的本地化

通过Linq查询从双值的元组返回一个List

双值绑定问题

OpenCV 中的高效矩阵复制

在 Java 中双击 JTable 上的侦听器