2015-03-24 9 views
7

Bir dize dizisini, işlemci mimarisine bağlı olarak her 4 veya 8 karakterlik bir işlemin yapıldığı bir dizide yeniden yorumlamak istiyorum., dizeden dize olan bir diziyi yeniden yorumla

Bunu nispeten ucuz bir şekilde gerçekleştirmenin bir yolu var mı? Bu denedik ama bir 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 ]); 
     } 
    } 
} 

ÇÖZÜM 4 karakter reinterpret görünmüyor: Neredeyse doğru var

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

C# içindeki karakterler 2 bayttır, böylece Int32 işaretçisi ile int başına iki karakter elde edersiniz. – Erik

+0

Karakterlerinizin 8-bitlik bir dostu olduğunu biliyorsanız, bunları ayıklayıp her bir tam sayıya kendiniz doldursunuz, ancak verilerin bir kopyasını almanız gerekir. – yoyo

+0

Lütfen, ["Başlıklardaki" etiketler "etiketlerini içerir mi?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) "hayır, yapmamalılar" –

cevap

4

(ihtiyaçlarınıza dayalı değişim Int64 veya Int32). sizeof(char) == 2 && sizeof(int) == 4. Döngü dönüştürme faktörü 2, 4 değil. sizeof(int)/sizeof(char). Bu stili beğendiyseniz, bu tam ifadeyi kullanabilirsiniz. sizeof az bilinen bir C# özelliğidir.

Not: Şu anda, uzunluk eşit değilse bile son karakteri kaybedersiniz.

Performans hakkında: Yaptığınız yolun aldığı kadar ucuzdur.

+0

Son char'yu nasıl güvenle okuyabilirim? – sam

+0

Sadece dizeden direk okudum. – usr