2012-02-17 21 views
6

Sto convertendo l'array 2dimensional in Single dimensional in C#. Ricevo l'array bidimensionale dal dispositivo (C++) e quindi lo converto in 1 dimensionale in C#. Ecco il mio codice:Conversione di array bidimensionali in monodimensionale in C#?

int iSize = Marshal.SizeOf(stTransactionLogInfo); //stTransactionLogInfo is a structure 
byte[,] bData = (byte[,])objTransLog; //objTransLog is 2 dimensionl array from device 
byte[] baData = new byte[iSize]; 

for (int i = 0; i < bData.GetLength(0); i++) 
{ 
    for (int j = 0; j < iSize; j++) 
    { 
     baData[j] = bData[i, j]; 
    } 
} 

ottengo il risultato desiderato dall'alto codice, ma il problema è che non è il modo standard di implementazione. Voglio sapere come può essere fatto in un modo standard. Potrebbe fare Marshalling, non sono sicuro. Grazie in anticipo.

+1

Perché pensi che non sia il modo standard? Mi sta bene. –

risposta

12

È possibile utilizzare il Buffer.BlockCopy Method:

byte[,] bData = (byte[,])objTransLog; 

byte[] baData = new byte[bData.Length]; 

Buffer.BlockCopy(bData, 0, baData, 0, bData.Length); 

Esempio:

byte[,] bData = new byte[4, 3] 
{ 
    { 1, 2, 3 }, 
    { 4, 5, 6 }, 
    { 7, 8, 9 }, 
    { 10, 11, 12 } 
}; 

byte[] baData = new byte[bData.Length]; 

Buffer.BlockCopy(bData, 0, baData, 0, bData.Length); 

// baData == { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } 
+0

Questo non mi dà il risultato desiderato.Buffer.BlockCopy sarà all'interno per ciclo? – user662285

+0

Ho aggiunto un esempio. Un ciclo 'for' non è necessario. – dtb

+0

Fine.Ora il problema è Copierà tutti i dati in una volta. Ma voglio i dati in blocchi di dimensione My Structure (supponiamo che la dimensione sia 270) perché sto usando questi dati binari per formare My Structure.Structure è composto da diversi campi che vengono riempiti di dati e all'ultimo che sto mostrando questi dati in un griglia, riga dopo riga. – user662285

4

metodo più semplice

int iSize = Marshal.SizeOf(stTransactionLogInfo); //stTransactionLogInfo is a structure 
byte[,] bData = (byte[,])objTransLog; //objTransLog is 2 dimensionl array from device 
byte[] baData = bData.Cast<byte>().ToArray(); 
1

facile da understend ec su una lingua diversa.

// Create 2D array (20 rows x 20 columns) 
int row = 20; 
int column = 20; 
int [,] array2D = new int[row, column]; 

// paste into array2D by 20 elements 
int x = 0; // row 
int y = 0; // column 

for (int i = 0; i < my1DArray.Length; ++i) 
{ 
    my2DArray[x, y] = my1DArray[i]; 
    y++; 
    if (y == column) 
    { 
      y = 0;  // reset column 
      x++;  // next row 
    } 
} 
0

bData.Cast<byte>() convertirà la matrice multidimensionale ad una sola dimensione.

Questo farà boxing, unboxing quindi non è il modo più performante, ma è sicuramente il più semplice e sicuro.

Problemi correlati