2013-08-02 6 views
7

私はオブジェクトをバイト配列に変換するためにConvert an array of different value types to a byte arrayソリューションを使用しています。オブジェクト#をバイト[]に変換するのに、バイトオブジェクトをバイトとして保持する方法はありますか?

しかし、私は大きな問題を引き起こす小さな問題があります。

オブジェクト[]のミドルには「バイト」タイプのデータがありますが、「バイト」をそのまま保持する方法はわかりません。前後に同じバイト長を保持する必要があります。

私はこのような辞書に「バイト」タイプを追加してみました:

private static readonlyDictionary<Type, Func<object, byte[]>> Converters = 
    new Dictionary<Type, Func<object, byte[]>>() 
{ 
    { typeof(byte), o => BitConverter.GetBytes((byte) o) }, 
    { typeof(int), o => BitConverter.GetBytes((int) o) }, 
    { typeof(UInt16), o => BitConverter.GetBytes((UInt16) o) }, 
    ... 
}; 
public static void ToBytes(object[] data, byte[] buffer) 
{ 
    int offset = 0; 

    foreach (object obj in data) 
    { 
     if (obj == null) 
     { 
      // Or do whatever you want 
      throw new ArgumentException("Unable to convert null values"); 
     } 
     Func<object, byte[]> converter; 
     if (!Converters.TryGetValue(obj.GetType(), out converter)) 
     { 
      throw new ArgumentException("No converter for " + obj.GetType()); 
     } 

     byte[] obytes = converter(obj); 
     Buffer.BlockCopy(obytes, 0, buffer, offset, obytes.Length); 
     offset += obytes.Length; 
    } 
} 

「そこにはsyntext訴えはありませんが、プログラムが

byte[] obytes = converter(obj); 

元を実行した後、私は、このコードをトレースしバイト "はバイト[2]になります。

ここではどうなりますか?このソリューションでバイト値を本物に保つにはどうすればいいですか?

ありがとうございます!

+1

ここでは何が起こっているのかはっきりしません。あなたはオブジェクトを作成するコードとそれを解凍するコードを表示できますか? – cdhowie

+0

'GetBytes'が配列を返すので、配列を取得しています。それがはっきりしていないので、ここでは正確に何をしようとしていますか? –

+0

元の投稿を更新しました。私はGetBytesが配列を返すことを知っていますが、私はそれが私のorignialバイト値のためにbyte [1]を返すことを望みます。 –

答えて

14

byteを取る何BitConverter.GetBytesオーバーロードはありませんので、あなたのコードは:

BitConverter.GetBytes((byte) o) 

暗黙のうち、最も近いマッチに展開されている:BitConverter.GetBytes(short)Int16)を、2バイトになります。あなたがする必要があるのは、単一要素のバイト配列を返すことだけです。このように:

{ typeof(byte), o => new[] { (byte) o } } 
+0

ありがとう、すべて。できます。私はこのラムダ事を理解していませんでした。 –

関連する問題