2013-08-02 13 views
7

Używam rozwiązania Convert an array of different value types to a byte array dla moich obiektów do konwersji tablicy bajtów.C# przekształcić obiekt [] na bajt [], ale jak zachować bajt jako bajt?

Ale mam mały problem, który powoduje duży problem.

Istnieje typ danych "bajtowych" w środku obiektu [], nie wiem jak zachować "bajt", jak jest. Potrzebuję zachować tę samą długość bajtów przed i po.

Próbowałem dodać „bajt” typ do słownika jak ten:

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

nie ma syntext skarży, ale prześledzić ten kod, po program wykonywany

byte[] obytes = converter(obj); 

oryginalny " "bajt" staje się bajtem [2].

Co się tutaj dzieje? Jak zachować autentyczność bajtu w tym rozwiązaniu?

Dzięki!

+1

Nie jest jasne, co się tutaj dzieje. Czy możesz pokazać kod, który tworzy obiekt, a także kod, który go rozpakowuje? – cdhowie

+0

Otrzymujesz tablicę, ponieważ 'GetBytes' zwraca tablicę. Co dokładnie próbujesz zrobić, ponieważ nie jest to jasne. –

+0

Zaktualizowałem mój oryginalny post. Wiem, że GetBytes zwraca tablicę, ale chcę, aby zwróciła bajt [1] dla mojej oryginalnej wartości bajtu. –

Odpowiedz

14

Nie ma BitConverter.GetBytes przeciążenie, że trwa byte, więc kod:

BitConverter.GetBytes((byte) o) 

jest niejawnie rozszerzył się na najbliższym meczu: BitConverter.GetBytes(short) (Int16), w wyniku czego dwa bajty. Wystarczy, że zwrócisz jednoelementową tablicę bajtów, np. tak:

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

Dziękuję wszystkim. To działa. Nie rozumiałem tego lambda. –