2013-04-04 26 views
7

short dizisini string dönüştürmek mümkün mü, sonra metni göster?Kısa Dizeyi C Dize Dönüştürme #

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

utf16 (Tay karakter) dizideki içeren bulunmaktadır. Tay ve ingilizce kelimeleri nasıl çıktı ve gösterebilir?

Teşekkür ederiz.

+3

sen * Bir 'short' diziye başlamak * var mı? Bunun yerine bir "char" dizisiyle başlayabilirseniz (her 'char' 16 bit işaretsiz bir tamsayıdır) o zaman çok daha basit olurdu ... –

cevap

3

bu deneyin:

//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

Bu bir kısa [] dizgiye dönüştürülmüyor ... kısa [] için char [] olarak kod_a yazılır ve daha sonra _that_ bir dizeye dönüştürülür. – Sepster

+1

@Sepster: Asker kısa bir dizgeye ihtiyaç duyduklarını söylerken bir ip ister, onlar char'ın UTF-16'yı desteklediğini fark etmeyebilirler. – Guvante

+1

@Guvante "Kısa diziyi dizgeye dönüştürmek mümkün mü" sorusu. Cevabın faydalı olduğunu kabul etmemek ... (bu yüzden düşürmedim), ama oturduğunda, soruya cevap vermiyor. – Sepster

10

bu yöntemi kullanarak bir UTF16 bayt diziden bir dize alabilirsiniz:

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

Ancak, bu yalnızca bir bayt dizisi kabul eder. Yani önce bayt şortunu dönüştürmek zorunda:

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

Veya biraz daha ayrıntılı ama çok daha verimli kod:

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

Buffer.BlockCopy – MrMoDoJoJr

+0

'u kullanarak bir bayt dizisine dönüştürülecektim İyi nokta MrMoDoJoJr, Gönderimi düzenledim. – JustAnotherUserYouMayKnow

0

bu deneyin:

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 çalışmayacak çünkü OP dizide UTF16 karakterleri bulunduğunu söyledi. – itsme86

+0

Ve kodunuzu kullanarak, bir dize değil dizelerin bir listesini alırsınız. – JustAnotherUserYouMayKnow

1

Sen bir dizi ihtiyaç char. string, doğrudan birini kabul eden bir aşırı yüke sahiptir.

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

Ne yazık ki bu, tüm dizinin kopyalanmasını içerir. Bazı döküm hileleri ve güvenli olmayan kod kullanarak bunu teorik olarak önleyebilirsiniz, ancak bu zor olacaktır.

İdeal olarak, diğerlerinin de belirttiği gibi, short[] yerine char[] ile başlayacaksınız. Örneğin, bir dosyadan yüklüyorsanız, bulduğunuz sayıları char[]'a aktardıktan sonra saklayabilirsiniz.

4

Biraz herkesin cevapları parçalamakla, ama burada aynı şeyi yapmanın daha temiz bir yoldur ediyorum:

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