我面临一个棘手的问题。我希望通过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字段压缩了很多其他类型的值,所以我无法改变数据库的结构。提前谢谢大家。
答案 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();