2016-05-13 4 views
2

J'ai un tableau Ushort qui doit être converti en un tableau d'octets à transférer sur un réseau.Convertir ushort [] en octets [] et retour

Une fois arrivé à destination, j'ai besoin de le reconvertir dans le même tableau qu'avant.

Ushort Tableau

est un tableau qui est de longueur 217088 (tableau 1D de panne d'image 512 par 424). Il est stocké sous la forme d'entiers non signés de 16 bits. Chaque élément est de 2 octets.

Tableau d'octets

Il doit être converti en un tableau d'octets à des fins de réseau. Comme chaque élément ushort vaut 2 octets, je suppose que le tableau d'octets Longueur doit être 217,088 * 2?

En termes de conversion, puis de «non-conversion» correctement, je ne suis pas sûr de la façon de le faire.

Ceci est pour un projet Unity3D en C#. Quelqu'un peut-il m'indiquer la bonne direction?

Merci.

Répondre

1

Vous cherchez BlockCopy:

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

et oui, short ainsi que ushort est de 2 octets; et c'est pourquoi le tableau correspondant byte devrait être deux fois plus long que le short initial.

direct (byte-short):

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

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

inverse:

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

utilisant offset s (la secondes et les quatrième paramètres de Buffer.BlockCopy) vous pouvez avoir tableau 1D être ventilé (comme vous l'avez dit):

// 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

Merci pour votre inscription. Peux-tu nous expliquer ce que les '{5, 6}' et '{7, 8}' font exactement? Merci. –

+0

@Oliver Jone: '{5, 6}' sont juste des * valeurs d'échantillon *: 'new byte [] {5, 6};' - crée un nouveau tableau d'octets avec deux éléments - '5' et' 6'. –

+0

Merci pour cela, je voulais juste souligner que vous pourriez avoir besoin d'utiliser Buffer.BlockCopy (image [i], 0, données, offset, count); 'lors d'une copie de tableau multidimensionnel (0 étant la position de départ de chaque tableau que les répétitions de boucle pour) – Snouto