2012-01-09 15 views
0

SQLiteデータベースのテーブル(フィールドデータ型はBLOB)にbyte []を保存します。私はバイト形式で(未バイト[]の形式で)-36524.063415093093を言う負のダブル値を保存したいという配列でSQLiteデータベースに格納するためにDouble値をバイト値に変換します。

Double b = -36524.063415093093; 

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

私はConvert.ToByteを書くとき(b)は、それがあれば、エラー&を与えます私は(バイト)bを返します84返す

しかし、どのように私は84を-36524.063415093093に変換するのですか?

私のアプローチが間違っている場合は修正してください。

答えて

3

は修正してください?

あなたのアプローチは、あなたが(8ビットだけである)の単一バイトに(64ビットを必要とする)doubleを格納することはできません

;-)間違っています。それは不可能です

バイト配列を得ることができます。これは、すべての64ビットが8バイトに広がっているだけです。これにより、ダブルをバイト配列に格納することができます。しかし、それはあなたが望んでいないことを示しています。

2

MSDNから:

ダブルキーワードは、64ビット浮動小数点だから

値あなたにdoubleを変換するとき、あなたはバイトの配列を取得します保存する単純型を表し、 byte[]。変換自体は次のようになります:私のアプローチが間違っている場合

byte[] array = BitConverter.GetBytes(double) 
1

doubleは8バイトのメモリを使用するため、おそらくBitConverterクラスを使用してバイト配列に変換する必要があります。

0

しかし、私は84を-36524.063415093093に戻す方法を教えてください。

できません。あなたは84を取得している理由は、doublebyteに破棄情報からその変換である:整数へ

  1. 変換は-36524(0xffff7154)を残して、数の小数部分を破棄します。
  2. が0x54を残しbyte破棄し、すべてが、最後の8ビットに切り捨て、または84

元の値を復元する方法はありません。あなたのデコードルーチンは、84.0または2132.9の代わりに-36524.063415093093を意味することをどのように知っていますか?

doubleをデータベースに格納する場合は、8ビットだけでなく64ビットすべてを格納する必要があります。これを行う最も簡単な方法は、データをBLOBとしてエンコードする代わりにREAL列を使用することです。

あなたがBLOBを使用する理由を持っている場合は、それはが何であるかを説明してください。

0

明示的なレイアウトのヘルパー構造体を使用して、ダブルをバイトに変換して戻すことができます。

[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つの同一構造体生成:

byte[] bytes = new[] { ds1.byte0, ds1.byte1, ds1.byte2, ds1.byte3, 
         ds1.byte4, ds1.byte5, ds1.byte6, ds1.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 
}; 

関連する問題