2013-08-02 13 views
7

Ich verwende Convert an array of different value types to a byte array Lösung für meine Objekte zur Byte-Array-Konvertierung.C# Objekt [] in Byte [] konvertieren, aber wie Byte-Objekt als Byte beibehalten?

Aber ich habe ein kleines Problem, das ein großes Problem verursacht.

Es gibt "Byte" Art von Daten in den Mitten des Objekts [], ich weiß nicht, wie man "Byte" behält, wie es ist. Ich brauche die gleiche Anzahl Bytes vorher und nachher.

Ich habe versucht, add "Byte" Typ in das Wörterbuch wie folgt aus:

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

gibt es keine Syntext beschweren, aber ich diesen Code verfolgt, nachdem das Programm

ausgeführt
byte[] obytes = converter(obj); 

das Original " Byte "wird zu Byte [2].

Was passiert hier? Wie kann der Byte-Wert in dieser Lösung authentisch bleiben?

Danke!

+1

Es ist nicht klar, was hier passiert. Können Sie den Code, der das Objekt erstellt, sowie den Code, der es entpackt, anzeigen? – cdhowie

+0

Sie erhalten ein Array, weil 'GetBytes' ein Array zurückgibt. Was genau willst du hier machen, weil es nicht klar ist? –

+0

Ich habe meinen ursprünglichen Post aktualisiert. Ich weiß, dass GetBytes ein Array zurückgibt, aber ich möchte das Byte [1] für meinen ursprünglichen Byte-Wert zurückgeben. –

Antwort

14

Es gibt keine BitConverter.GetBytes Überlastung, die eine byte nimmt, so dass Ihr Code:

BitConverter.GetBytes((byte) o) 

in die nächste Übereinstimmung implizit erweitert wird: BitConverter.GetBytes(short) (Int16), in zwei Bytes führt. Alles, was Sie tun müssen, ist ein Einzelelement-Byte-Array, z. wie folgt:

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

Vielen Dank, alle. Es klappt. Ich habe dieses Lambda-Ding nicht verstanden. –