2015-03-24 14 views
7

Mi piacerebbe reinterpretare una stringa in una matrice di int in cui ogni int si occupa di 4 o 8 caratteri in base all'architettura del processore.reinterpretare cast da una stringa a int

C'è un modo per ottenere questo in modo relativamente economico? Ho provato questo, ma non sembra reinterpretare 4 caratteri in un 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 ]); 
     } 
    } 
} 

SOLUZIONE: (modifica Int64 o Int32 in base alle esigenze)

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

I caratteri in C# sono 2 byte, quindi con un puntatore Int32 otterrete due caratteri per int. – Erik

+0

Se sai che i tuoi personaggi sono amichevoli a 8 bit, puoi estrarli da soli e inserire quattro in ogni numero intero, ma dovresti fare una copia dei dati. – yoyo

+0

Si prega di vedere ["Le domande dovrebbero includere" tag "nei loro titoli?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), dove il consenso è "no, non dovrebbero"! –

risposta

4

È quasi capito bene. sizeof(char) == 2 && sizeof(int) == 4. Il fattore di conversione del ciclo deve essere 2, non 4. È sizeof(int)/sizeof(char). Se ti piace questo stile puoi usare questa espressione esatta. sizeof è una caratteristica C# poco conosciuta.

Nota, che adesso perdi l'ultimo carattere se la lunghezza non è uniforme.

Informazioni sulle prestazioni: il modo in cui l'hai fatto è economico quanto più.

+0

come leggere in modo sicuro l'ultimo carattere? – sam

+0

Lo leggerei direttamente dalla stringa. – usr