2016-05-13 19 views
2

Ich habe ein Ushort-Array, das in ein Byte-Array konvertiert werden muss, um über ein Netzwerk übertragen zu werden.Konvertieren Sie ushort [] in Byte [] und zurück

Sobald es an seinem Ziel angekommen ist, muss ich es dann wieder in das gleiche ushort-Array zurückkonvertieren, mit dem es war.

Ushort Array

ist ein Array, das der Länge beträgt 217,088 (1D-Array aus zerlegten Bild 512 von 424). Es wird als vorzeichenlose 16-Bit-Ganzzahlen gespeichert. Jedes Element ist 2 Bytes.

Byte-Array

Es muss für Netzwerk Zwecke in ein Byte-Array umgewandelt werden. Da jedes ushort-Element 2 Bytes wert ist, nehme ich an, dass das Byte-Array Length 217.088 * 2 sein muss?

In Bezug auf die Konvertierung und dann "nicht korrekt konvertieren", bin ich unsicher, wie das geht.

Dies ist für ein Unity3D-Projekt in C#. Könnte mir jemand in die richtige Richtung zeigen?

Danke.

Antwort

1

Sie suchen BlockCopy:

https://msdn.microsoft.com/en-us/library/system.buffer.blockcopy(v=vs.110).aspx

und ja, short sowie ushort 2 Bytes lang ist; und deshalb sollte das entsprechende byte Array zweimal länger als das ursprüngliche short eins sein.

Direct (byte-short):

byte[] source = new byte[] { 5, 6 }; 
    short[] target = new short[source.Length/2]; 

    Buffer.BlockCopy(source, 0, target, 0, source.Length); 

Rückseite:

short[] source = new short[] {7, 8}; 
    byte[] target = new byte[source.Length * 2]; 
    Buffer.BlockCopy(source, 0, target, 0, source.Length * 2); 

mit offset s (die Sekunden und die vierten Parameter Buffer.BlockCopy) Sie können 1D-Array haben sein zerlegt (wie Sie es gesagt haben):

// it's unclear for me what is the "broken down 1d array", so 
    // let it be an array of array (say 512 lines, each of 424 items) 
    ushort[][] image = ...; 

    // data - sum up all the lengths (512 * 424) and * 2 (bytes) 
    byte[] data = new byte[image.Sum(line => line.Length) * 2]; 

    int offset = 0; 

    for (int i = 0; i < image.Length; ++i) { 
    int count = image[i].Length * 2; 

    Buffer.BlockCopy(image[i], offset, data, offset, count); 

    offset += count; 
    } 
+0

Danke dafür. Kannst du erklären, was die '{5, 6}' und '{7, 8}' genau machen? Vielen Dank. –

+0

@Oliver Jone: '{5, 6}' sind nur * Beispielwerte *: 'new byte [] {5, 6};' - erstellt ein neues Byte-Array mit zwei Elementen - '5' und' 6'. –

+0

Danke dafür, ich wollte nur darauf hinweisen, dass Sie 'Buffer.BlockCopy (image [i], 0, data, offset, count);' verwenden müssen, wenn Sie eine multidimensionale Array-Kopie machen (0 ist die Startposition von jedem) Array als die for-Schleife wiederholt) – Snouto