Java和C#中低级实现double值

时间:2012-10-14 08:40:55

标签: c# java database double

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

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

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字段中获取正确的double值。任何人都可以给我一些关于如何将Java定义的二进制样式double值转换为C#double值的建议吗?

顺便说一下,因为blob字段压缩了很多其他类型的值,所以我无法改变数据库的结构。提前谢谢大家。

1 个答案:

答案 0 :(得分:1)

使用BitConverter

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

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

Alternitavely ,您可以通过在BinaryReader上创建MemoryStream来获得与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();