4

我面临一个棘手的问题。我想通过 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 字段压缩了很多其他类型的值,我无法更改数据库的结构。谢谢大家。

4

1 回答 1

1

使用BitConverter

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

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

或者,您可以通过在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();
于 2012-10-14T09:39:24.887 回答