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

本文关键字:SQLite 数据库 存储 Byte Double 转换 | 更新日期: 2023-09-27 18:19:44

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

在该数组中,我想以字节格式(非字节[]格式)保存一个负数Double值,比如-36524.063415093093

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

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

但是如何将84转换回-36524.063415093093?

如果我的方法错误,请纠正?

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

如果我的方法错误,请纠正?

你的做法是错误的;-)

不能将双精度(需要64位)存储到单个字节(只有8位)中。是不可能的

您可以得到一个字节数组,它只是分布在8个字节中的所有64位。这将允许您将double存储在一个字节数组中。但你表示你不想那样。

来自MSDN:

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

因此,当您将double转换为byte[]时,您将获得字节数组。转换本身看起来像:

byte[] array = BitConverter.GetBytes(double)

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

但是如何将84转换回-36524.063415093093?

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

  1. 转换为整数会丢弃数字的小数部分,留下-36524(0xffff7154)
  2. 截断到byte将丢弃除最后8位之外的所有位,留下0x54或84

没有办法重建原始价值。你的解码程序怎么知道你的意思是-36524.063415093093,而不是84.0或2132.9?

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

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

可以将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;
}

下面的例子产生了两个相同的结构:

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 };