2016-09-07 3 views
0

Ich habe ein Byte-Array result. Ich würde gerne meinen Typ namens Info konvertieren, die alle int in das Byte-Array sind, aber alle von ihnen sind in unterschiedlicher Größe.Convert Int in andere Größe von Byte-Array

a = 4 Bytes

b = 3 Bytes

c = 2 Bytes

d = 1 Byte

Dies ist der Code habe ich versucht.

private byte[] getInfoByteArray(Info data) 
{ 
    byte[] result = new byte[10]; 
    BitConverter.GetBytes((data.a)).CopyTo(result, 0); 
    BitConverter.GetBytes((data.b)).CopyTo(result, 4); 
    BitConverter.GetBytes((data.c)).CopyTo(result, 7); 
    result [9] = Convert.ToByte(data.d); 

    return result; 
    } 

Allerdings habe ich herausgefunden, dass BitConverter.GetBytes 4 Bytes zurückgibt.

Gibt es allgemeine Lösungen, die unterschiedliche Byte-Größe zu einem Byte-Array erhalten können?

+0

'int' wird immer als 4 Bytes gespeichert. 'GetBytes()' gibt nicht immer nur Byte-Arrays mit der Länge 4 zurück, sondern nur, weil Sie den Datentyp 'int' verwenden. Sie können [diese Antwort] (http://stackoverflow.com/a/11651620/74757) verwenden, um die Mindestanzahl von Bytes zu berechnen, die benötigt werden, um Ihre ganzzahligen Werte zu halten (vermutlich die 4, 3, 2 und 1 Größen wie aufgelistet zurückzugeben)), trimmen Sie dann das Ergebnis von '.GetBytes()' auf diese Länge, bevor Sie es in Ihr endgültiges Byte-Array kopieren. –

+1

Es ist nicht klar, warum Sie unterschiedliche Byte-Längen für Ihre Felder haben möchten, besonders wenn es sich eigentlich um "int" -Typen handelt. Wenn Sie sicher sind, dass Sie wirklich nur 3, 2 oder 1 Byte für b, c und d brauchen, dann können c und d "kurz" und "byte" sein, was genau das ergibt, was Sie brauchen. Ihr Ergebnis für b hängt von der Endianess ab, aber Sie können das Array z. 'Array.Copy (BitConverter.GetBytes (data.b), 0, Ergebnis, 4, 3)'. I.e. Wenn Sie nicht alle Bytes wollen, ** kopieren Sie nicht alle Bytes **. –

Antwort

1

Verwenden Array.Copy(Array, Int32, Array, Int32, Int32) Methode:

byte[] result = new byte[10]; 
Array.Copy(BitConverter.GetBytes(data.a), 0, result, 0, 4); 
Array.Copy(BitConverter.GetBytes(data.b), 0, result, 4, 3); 
Array.Copy(BitConverter.GetBytes(data.c), 0, result, 7, 2); 
Array.Copy(BitConverter.GetBytes(data.d), 0, result, 9, 1); 

Diese Hardware-Little-Endian annimmt. Wenn Ihre Hardware Big Endian ist, verwenden Sie

byte[] result = new byte[10]; 
Array.Copy(BitConverter.GetBytes(data.a), 0, result, 0, 4); 
Array.Copy(BitConverter.GetBytes(data.b), 1, result, 4, 3); 
Array.Copy(BitConverter.GetBytes(data.c), 2, result, 7, 2); 
Array.Copy(BitConverter.GetBytes(data.d), 3, result, 9, 1);