2015-03-24 21 views
7

Chciałbym ponownie zinterpretować ciąg znaków w tablicy int, gdzie każdy int przejmie ładunek 4 lub 8 znaków na podstawie architektury procesora.reinterpretuj rzut tablic ze stringów na int

Czy istnieje sposób na osiągnięcie tego w stosunkowo niedrogi sposób? Starałem się to, ale nie wydaje się reinterpretacji 4 znaki w jednym int

string text = "abcdabcdefghefgh"; 

unsafe 
{ 
    fixed(char* charPointer = text) 
    { 
     Int32* intPointer = (Int32*)charPointer; 

     for(int index = 0; index < text.Length/4; index++) 
     { 
      Console.WriteLine(intPointer[ index ]); 
     } 
    } 
} 

Roztwór: (zmiana Int64 lub Int32 w zależności od potrzeb)

string text = "abcdabcdefghefgh"; 

unsafe 
{ 
    fixed(char* charPointer = text) 
    { 
      Int64* intPointer = (Int64*)charPointer; 
      int conversionFactor = sizeof(Int64)/sizeof(char); 

      int index = 0; 
      for(index = 0; index < text.Length/conversionFactor; index++) 
      { 
       Console.WriteLine(intPointer[ index ]); 
      } 

      if(text.Length % conversionFactor != 0) 
      { 
       intPointer[ index ] <<= sizeof(Int64); 
       intPointer[ index ] >>= sizeof(Int64); 

       Console.WriteLine(intPointer[ index ]); 
      } 
    } 
} 
+5

Chary w C# mają 2 bajty, więc z wskaźnikiem Int32 otrzymasz dwa znaki na int. – Erik

+0

Jeśli wiesz, że twoje postacie są przyjazne dla 8-bitów, możesz je wyodrębnić i wstawić cztery do każdej liczby całkowitej, ale musisz wykonać kopię danych. – yoyo

+0

Zobacz ["Czy w tytułach powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), gdzie konsensus jest "nie, nie powinni"! –

Odpowiedz

4

Prawie miał rację. sizeof(char) == 2 && sizeof(int) == 4. Współczynnik konwersji pętli musi wynosić 2, a nie 4. Jest to sizeof(int)/sizeof(char). Jeśli podoba ci się ten styl, możesz użyć tego dokładnego wyrażenia. sizeof to mało znana funkcja C#.

Pamiętaj, że teraz tracisz ostatni znak, jeśli długość nie jest równa.

O wydajności: sposób, w jaki to zrobiłeś, jest tak niedrogi, jak to tylko możliwe.

+0

jak bezpiecznie przeczytać ostatni znak? – sam

+0

Właśnie przeczytałem to z łańcucha bezpośrednio. – usr