将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?
如果我的方法错误,请纠正?
如果我的方法错误,请纠正?
你的做法是错误的;-)
不能将双精度(需要64位)存储到单个字节(只有8位)中。是不可能的
您可以得到一个字节数组,它只是分布在8个字节中的所有64位。这将允许您将double存储在一个字节数组中。但你表示你不想那样。
来自MSDN:
double关键字表示存储64位浮点值的简单类型
因此,当您将double
转换为byte[]
时,您将获得字节数组。转换本身看起来像:
byte[] array = BitConverter.GetBytes(double)
double使用8字节的内存,因此您可能需要使用BitConverter类将其转换为字节数组。
但是如何将84转换回-36524.063415093093?
你不能。得到84的原因是从double
到byte
的转换会丢弃信息:
- 转换为整数会丢弃数字的小数部分,留下-36524(0xffff7154)
- 截断到
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 };