2013-04-04 18 views
7

Czy można przekształcić tablicę short na string, a następnie wyświetlić tekst?Konwertuj krótką tablicę na ciąg C#

short[] a = new short[] {0x33, 0x65, 0x66, 0xE62, 0xE63}; 

Istnieją utf16 (tajskie znaki) zawiera w tablicy. Jak może wyświetlać słowa tajlandzkie i angielskie?

Dziękuję.

+3

Czy * nie * zacząć 'short' tablicy? Jeśli mógłbyś zacząć od tablicy 'char' zamiast niej (każdy znak' char' jest 16-bitową liczbą całkowitą bez znaku) wtedy byłby o wiele prostszy ... –

Odpowiedz

3

Spróbuj tego:

//short[] a = new short[] {0x33, 0x65, 0x66, 0xE62, 0xE63}; 
char[] a = new char[] {0x33, 0x65, 0x66, 0xE62, 0xE63}; 
string s = new string(a); 

Console.WriteLine(s); 
+0

To nie konwertuje krótkiego [] na ciąg ... to jest pisanie kodu_ dla krótkiego [] jako char [], a następnie przekształcenie _to na ciąg. – Sepster

+1

@Sepster: Pytający chce napisu, podczas gdy oni mówią, że potrzebują krótkiego [], mogą nie zdawać sobie sprawy, że char obsługuje UTF-16. – Guvante

+1

@Guvante "Czy możliwe jest przekonwertowanie krótkiej tablicy na ciąg" to pytanie. Nie zgadzam się, że odpowiedź jest przydatna ... (dlatego nie odrzucam), ale w jej trakcie nie odpowiada na pytanie. – Sepster

10

można uzyskać ciąg z tablicy bajtów UTF16 użyciu tej metody:

System.Text.Encoding.Unicode.GetString(bytes) 

Jednak to tylko akceptuje tablicę bajtów. Więc najpierw trzeba przekształcić swoje spodenki do bajtów:

var bytes = a.SelectMany(x => BitConverter.GetBytes(x)).ToArray(); 

lub nieco bardziej rozwlekły, ale znacznie bardziej efektywny kod:

var bytes = new byte[a.Length * 2]; 
Buffer.BlockCopy(a, 0, bytes, 0, a.Length * 2); 
+0

Chciałbym przekonwertować do tablicy bajtów za pomocą Buffer.BlockCopy – MrMoDoJoJr

+0

Dobra uwaga MrMoDoJoJr, redagowałem moje posty. – JustAnotherUserYouMayKnow

0

spróbuj tego:

short[] a = new short[] { 0x33, 0x65, 0x66, 0xE62, 0xE63 }; 
var contobyte = a.Select(b => (byte)b).ToArray(); 
var res = System.Text.Encoding.Unicode.GetString(contobyte); 
+0

UTF8 nie będzie działać, ponieważ OP powiedział, że w tablicy znajdują się znaki UTF16. – itsme86

+0

Za pomocą kodu otrzymasz listę ciągów, a nie ciąg znaków. – JustAnotherUserYouMayKnow

1

Musisz tablicę char. string ma przeciążenie, które akceptuje jeden bezpośrednio.

char[] temp = new char[a.Length]; 
Array.Copy(a, temp, a.Length); 
return new string(temp); 

Niestety wymaga to skopiowania całej tablicy. Można teoretycznie tego uniknąć, stosując niektóre sztuczki z odlewu i niebezpieczny kod, ale byłoby to trudne.

Idealnie, jak wspominali inni, można zacząć od char[] zamiast short[]. Na przykład, jeśli ładujesz z pliku, możesz przechowywać znalezione numery w char[] po ich przesłaniu.

4

jestem lekko oderwanie wszystkich innych odpowiedzi, ale tutaj jest czystszy sposób robi to samo:

short[] shorts = new short[] { 0x33, 0x65, 0x66, 0xE62, 0xE63 }; 
char[] chars = Array.ConvertAll(shorts, Convert.ToChar); 
string result = new string(chars);