我想在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?
如果我的方法有误,请更正吗?
答案 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的原因是从double
到byte
的转换会丢弃信息:
byte
会丢弃除最后8位以外的所有位,留下0x54或84. 没有办法重建原始值。您的解码例程如何知道您的意思是-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 };