2012-02-17 12 views
6

Konwertuję dwuwymiarową tablicę na jednowymiarową w języku C#. Otrzymuję dwuwymiarową tablicę z urządzenia (C++), a następnie przekonwertuję ją na 1 wymiar w języku C#. Oto mój kod:Konwersja dwuwymiarowej tablicy na jednowymiarowy w języku 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]; 
    } 
} 

uzyskać pożądany wynik z powyższym kodem, ale problemem jest to, że nie jest to standardowy sposób realizacji. Chcę wiedzieć, jak można to zrobić w standardowy sposób. Może robić Marshalling, nie jestem pewien. Z góry dzięki.

+1

Dlaczego uważasz, że nie jest to standardowy sposób? Dla mnie wygląda dobrze. –

Odpowiedz

12

można użyć Buffer.BlockCopy Method:

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

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

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

przykład:

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

To nie daje mi pożądanego rezultatu. Buffer.BlockCopy będzie w środku pętli? – user662285

+0

Dodałem przykład. Pętla 'for' nie jest potrzebna. – dtb

+0

Dobrze. Teraz problem. Spowoduje to skopiowanie wszystkich danych naraz. Ale chcę danych w blokach rozmiaru My Structure (przypuśćmy, że rozmiar to 270), ponieważ używam tych danych binarnych do utworzenia My Structure.Structure składa się z kilku pól, które są wypełniane danymi, a na Last wyświetlają te dane w siatka, wiersz po wierszu. – user662285

4

Najprostsza metoda

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

łatwy do understend i c do innego języka.

// 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>() przekształci tablicę wielowymiarową w pojedynczy wymiar.

To spowoduje boks, rozpakowanie, więc nie jest to najbardziej wydajna metoda, ale z pewnością jest najprostsza i najbezpieczniejsza.

Powiązane problemy