将Double Value转换为Byte值以存储在SQLite数据库中

时间:2012-01-09 07:23:46

标签: c# .net wpf

我想在SQLite数据库的表中保存一个byte [](字段数据类型为BLOB)。

在那个数组中,我想以字节格式保存负的Double值-36524.063415093093(不是byte []格式)

Double b = -36524.063415093093;

//  Signature is 
//  byte[] arr = new Byte[] {Double, byte, byte, byte};

当我写Convert.ToByte(b)时,它会给出错误&如果我写(字节)b它返回84。

但如何将84转换回-36524.063415093093?

如果我的方法有误,请更正吗?

5 个答案:

答案 0 :(得分:3)

  

如果我的方法有误,请更正吗?

你的做法是错误的; - )

您不能将double(需要64位)存储到单个字节(仅为8位)。这是不可能的

你可以得到一个字节数组,它只是遍布8个字节的所有64位。这样可以将double存储在一个字节数组中。但是你表明你不希望这样。

答案 1 :(得分:2)

来自MSDN

  

double关键字表示存储64位浮点值的简单类型

因此,当您将double转换为byte[]时,您将获得字节数组。转换本身将如下所示:

byte[] array = BitConverter.GetBytes(double)

答案 2 :(得分:1)

double使用8个字节的内存,因此您可能需要使用BitConverter类将其转换为字节数组。

答案 3 :(得分:0)

  

但如何将84转换回-36524.063415093093?

你做不到。您获得84的原因是从doublebyte的转换会丢弃信息:

  1. 转换为整数会丢弃该数字的小数部分,留下-36524(0xffff7154)。
  2. 截断到byte会丢弃除最后8位以外的所有位,留下0x54或84.
  3. 没有办法重建原始值。您的解码例程如何知道您的意思是-36524.063415093093而不是84.0或2132.9?

    如果要在数据库中存储double,则需要存储它的所有64位,而不仅仅是8位。最简单的方法是使用REAL列,而不是将数据编码为BLOB

    如果您有原因使用BLOB,那么请说明它是什么

答案 4 :(得分:0)

可以使用带有显式布局的辅助结构将double转换为字节并返回。

[StructLayout(LayoutKind.Explicit)]
public struct DoubleStruct
{
    [FieldOffset(0)]
    public double value;

    [FieldOffset(0)]
    public byte byte0;

    [FieldOffset(1)]
    public byte byte1;

    [FieldOffset(2)]
    public byte byte2;

    [FieldOffset(3)]
    public byte byte3;

    [FieldOffset(4)]
    public byte byte4;

    [FieldOffset(5)]
    public byte byte5;

    [FieldOffset(6)]
    public byte byte6;

    [FieldOffset(7)]
    public byte byte7;
}

以下示例生成2个相同的结构:

DoubleStruct ds = new DoubleStruct { value = -36524.063415093093 };

DoubleStruct ds1 = new DoubleStruct
{
    byte0 = 0xDD,
    byte1 = 0x16,
    byte2 = 0x7F,
    byte3 = 0x07,
    byte4 = 0x82,
    byte5 = 0xD5,
    byte6 = 0xE1,
    byte7 = 0xC0
};

要将辅助结构转换为字节数组,请使用:

byte[] bytes = new[] { ds1.byte0, ds1.byte1, ds1.byte2, ds1.byte3,
                      ds1.byte4, ds1.byte5, ds1.byte6, ds1.byte7 };