2015-03-24 7 views
7

Ich möchte eine Zeichenfolge in einem Array von Int neu interpretieren, wobei jedes Int auf der Grundlage der Prozessorarchitektur 4 oder 8 Zeichen übernehmen.reinterpretieren ein Array von String in int

Gibt es eine Möglichkeit, dies relativ kostengünstig zu erreichen? Ich versuchte dies, aber scheint nicht 4 Zeichen in einem 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 ]); 
     } 
    } 
} 

SOLUTION neu zu interpretieren: (Änderung Int64 oder Int32 nach Ihren Bedürfnissen)

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

Zeichen in C# sind 2 Bytes, also mit einem Int32-Zeiger erhalten Sie zwei Zeichen pro int. – Erik

+0

Wenn Sie wissen, dass Ihre Zeichen 8-Bit-freundlich sind, können Sie sie extrahieren und vier in jede ganze Zahl stopfen, aber Sie müssten eine Kopie der Daten erstellen. – yoyo

+0

Bitte beachten Sie ["Sollten Fragen enthalten" Tags "in ihren Titeln?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-the-titles), wo der Konsens ist "nein, sollten sie nicht"! –

Antwort

4

Du hast es fast richtig. sizeof(char) == 2 && sizeof(int) == 4. Der Umsetzungsfaktor der Schleife muss 2 sein, nicht 4. Es ist sizeof(int)/sizeof(char). Wenn Sie diesen Stil mögen, können Sie genau diesen Ausdruck verwenden. sizeof ist eine wenig bekannte C# -Funktion.

Beachten Sie, dass Sie gerade das letzte Zeichen verlieren, wenn die Länge nicht gleichmäßig ist.

Über die Leistung: Die Art, wie Sie es getan haben, ist so billig wie es nur geht.

+0

Wie sicher zu lesen letzte Char? – sam

+0

Ich habe es gerade aus der Zeichenfolge direkt gelesen. – usr

Verwandte Themen