UTF-8 baytlarını [] bir stringə necə çevirmək olar?

UTF-8 ehtiva edən bir fayldan yüklənən bir byte[] array var. Bəzi ayıklama kodunda, onu bir simliya çevirmək lazımdır. Bunu edəcək bir liner varmı?

Qapaqların altında yalnız paylama və memkopy olmalıdır, buna görə də həyata keçirilmirsə belə mümkün olmalıdır.

805
16 июня '09 в 21:47 2009-06-16 21:47 BCS , 16 İyun tarixində saat 21:47 'də təyin olunur . 2009-06-16 21:47
@ 14 cavab
 string result = System.Text.Encoding.UTF8.GetString(byteArray); 
1285
16 июня '09 в 21:49 2009-06-16 21:49 Cavab Zanoni 16 iyun 16: 09-da verilir. 2009-06-16 21:49

Bu dönüşümün ən azı dörd fərqli yolu.

  • GetString kodlaşdırma
    lakin bu baytların qeyri-ASCII simvolları olduqda, orijinal baytları qaytaramırsınız.

  • BitConverter.ToString
    Çıxış məhdudlaşdırılmış "-" dir, lakin simli birbaşa baytlara çevirmək üçün quraşdırılmış .NET metodu yoxdur.

  • Convert.ToBase64String
    Convert.FromBase64String istifadə edərək, asanlıqla çıxış Convert.FromBase64String bayt bir sıra çevirə bilərsiniz.
    Qeyd Çıxış dizesi '+', '/' və '=' ehtiva edə bilər. Bir URL'de bir simli istifadə etmək istəyirsinizsə, bunu açıq şəkildə kodlaşdırmalısınız.

  • HttpServerUtility.UrlTokenEncode
    HttpServerUtility.UrlTokenDecode istifadə edərək asanlıqla çıxış HttpServerUtility.UrlTokenDecode bayt bir sıra çevirə bilərsiniz. Çıxış siması artıq URL üçün rahatdır! Dezavantajınız Layihə bir veb layihəsi deyilsə System.Web qurmaq lazımdır.

border=0

Tam nümunə:

 byte[] bytes = { 130, 200, 234, 23 }; // A byte array contains non-ASCII (or non-readable) characters string s1 = Encoding.UTF8.GetString(bytes); // byte[] decBytes1 = Encoding.UTF8.GetBytes(s1); // decBytes1.Length == 10 !! // decBytes1 not same as bytes // Using UTF-8 or other Encoding object will get similar results string s2 = BitConverter.ToString(bytes); // 82-C8-EA-17 String[] tempAry = s2.Split('-'); byte[] decBytes2 = new byte[tempAry.Length]; for (int i = 0; i < tempAry.Length; i++) decBytes2[i] = Convert.ToByte(tempAry[i], 16); // decBytes2 same as bytes string s3 = Convert.ToBase64String(bytes); // gsjqFw== byte[] decByte3 = Convert.FromBase64String(s3); // decByte3 same as bytes string s4 = HttpServerUtility.UrlTokenEncode(bytes); // gsjqFw2 byte[] decBytes4 = HttpServerUtility.UrlTokenDecode(s4); // decBytes4 same as bytes 
290
28 февр. Cavab verildi 2014-02-28 05:31 '14 saat 05:31 'də 2014-02-28 05:31

Şifrəni bilmədiyiniz zaman bir bayt dizisinden bir dize çevirmək üçün ümumi həll:

 static string BytesToStringConverted(byte[] bytes) { using (var stream = new MemoryStream(bytes)) { using (var streamReader = new StreamReader(stream)) { return streamReader.ReadToEnd(); } } } 
21
20 сент. Cavab Nir 20 sentyabr verilir. 2015-09-20 11:24 '15 at 11:24 AM 2015-09-20 11:24

Tanım:

 public static string ConvertByteToString(this byte[] source) { return source != null ? System.Text.Encoding.UTF8.GetString(source) : null; } 

İstifadə edin:

 string result = input.ConvertByteToString(); 
12
16 окт. Cavab 16 oktyabrda Erçin Dedeoğlu tərəfindən verilir . 2014-10-16 04:04 '14 at 4:04 2014-10-16 04:04

Bir byte[] çevirmək sadə görünür, lakin hər hansı bir kodlama çıxış dizəsini korlaya bilər. Bu kiçik xüsusiyyət gözlənilməz nəticələr olmadan işləyir:

 private string ToString(byte[] bytes) { string response = string.Empty; foreach (byte b in bytes) response += (Char)b; return response; } 
9
22 апр. AndrewJE'ye 22 Aprel cavab verildi 2015-04-22 14:48 '15 at 14:48 2015-04-22 14:48

(byte)b.ToString("x2") istifadə edərək, nəticələr b4b5dfe475e58b67

 public static class Ext { public static string ToHexString(this byte[] hex) { if (hex == null) return null; if (hex.Length == 0) return string.Empty; var s = new StringBuilder(); foreach (byte b in hex) { s.Append(b.ToString("x2")); } return s.ToString(); } public static byte[] ToHexBytes(this string hex) { if (hex == null) return null; if (hex.Length == 0) return new byte[0]; int l = hex.Length / 2; var b = new byte[l]; for (int i = 0; i < l; ++i) { b[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16); } return b; } public static bool EqualsTo(this byte[] bytes, byte[] bytesToCompare) { if (bytes == null  bytesToCompare == null) return true; // ? if (bytes == null || bytesToCompare == null) return false; if (object.ReferenceEquals(bytes, bytesToCompare)) return true; if (bytes.Length != bytesToCompare.Length) return false; for (int i = 0; i < bytes.Length; ++i) { if (bytes[i] != bytesToCompare[i]) return false; } return true; } } 
8
22 нояб. Cavab 22 noyabr tarixində metadlarla verilmişdir . 2014-11-22 20:15 '14 saat 20:15 'də 2014-11-22 20:15

Istifadə etmək üçün kifayət qədər asan bir UnicodeEncoding sinfi də var:

 ByteConverter = new UnicodeEncoding(); string stringDataForEncoding = "My Secret Data!"; byte[] dataEncoded = ByteConverter.GetBytes(stringDataForEncoding); Console.WriteLine("Data after decoding: {0}", ByteConverter.GetString(dataEncoded)); 
5
18 мая '15 в 16:38 2015-05-18 16:38 cavab PK 18 may, saat 15: 15-də verilir 2015-05-18 16:38

Bir byteArrFilename Linq bir byteArrFilename bir byteArrFilename byte byteArrFilename ascii C-style ilə sıfır kimi bir byteArrFilename çevirmək üçün aşağıdakı kimi sonlandırılır: Köhnə arxiv formatlarında index fayl masaları kimi şeyləri oxumaq üçün byteArrFilename .

 String filename = new String(byteArrFilename.TakeWhile(x => x != 0) .Select(x => x < 128 ? (Char)x : '?').ToArray()); 

Mən '?' istifadə edirəm '?' default char, burada təmiz ascii olmayan bir şeydir, amma əlbəttə bu dəyişilə bilər. TakeWhile başlanğıcda bu şəkildə qurulmuş simli giriş mənbəyindən '\0' qiyməti ola bilməyəcəyinə zəmanət TakeWhile , onu aşkar edə biləcəyinizə əmin olmaq istəyirsinizsə, sadəcə '\0' istifadə edin.

2
17 нояб. cavab noyabrın 17-də Nyerguds tərəfindən verilir 2016-11-17 11:12 '16 at 11:12 2016-11-17 11:12

Bildiyimiz kimi, bu cavablardan heç biri sıfır başa çatdıqda düzgün davranışa zəmanət verir. Biri məni fərqli bir şəkildə göstərməyincə, mən özüm statik sinifini aşağıdakı metodlardan istifadə etməklə yazdım:

 // Mimics the functionality of strlen() in c/c++ // Needed because niether StringBuilder or Encoding.*.GetString() handle \0 well static int StringLength(byte[] buffer, int startIndex = 0) { int strlen = 0; while ( (startIndex + strlen + 1) < buffer.Length // Make sure incrementing won't break any bounds  buffer[startIndex + strlen] != 0 // The typical null terimation check ) { ++strlen; } return strlen; } // This is messy, but I haven't found a built-in way in c# that guarentees null termination public static string ParseBytes(byte[] buffer, out int strlen, int startIndex = 0) { strlen = StringLength(buffer, startIndex); byte[] c_str = new byte[strlen]; Array.Copy(buffer, startIndex, c_str, 0, strlen); return Encoding.UTF8.GetString(c_str); } 

startIndex səbəbi startIndex olaraq startIndex , byte[] sıfır sonlandırılmış dizelerin bir startIndex olaraq startIndex . Sadə halda təhlükəsiz olaraq görülə bilməz.

2
29 июня '17 в 3:19 2017-06-29 03:19 Cavab Assimilater tərəfindən 29 iyun '17' də 3:19 2017-06-29 03:19 'də verilir

Alternativ olaraq:

  var byteStr = Convert.ToBase64String(bytes); 
2
15 сент. Cavab 15 sentyabr Fehr tərəfindən verilir . 2016-09-15 08:55 '16 'da 8:55' də 2016-09-15 08:55 'də

BitConverter sinfi, byte[] a string çevirmək üçün istifadə edilə bilər.

 var convertedString = BitConverter.ToString(byteAttay); 

BitConverter sinif BitConverter MSDN- də quraşdırıla bilər

2
05 янв. Cavab verilir Sagar 05 yanvar. 2017-01-05 13:53 '17 saat 13:53 'də 2017-01-05 13:53

hier - nəticə kodlaşdırma mövzusunda narahat olmadıqda. Mən şəbəkə sinifində istifadə etdim və ikili obyektləri göndərdim.

  public static byte[] String2ByteArray(string str) { char[] chars = str.ToArray(); byte[] bytes = new byte[chars.Length * 2]; for (int i = 0; i < chars.Length; i++) Array.Copy(BitConverter.GetBytes(chars[i]), 0, bytes, i * 2, 2); return bytes; } public static string ByteArray2String(byte[] bytes) { char[] chars = new char[bytes.Length / 2]; for (int i = 0; i < chars.Length; i++) chars[i] = BitConverter.ToChar(bytes, i * 2); return new string(chars); } 
0
06 июля '18 в 16:27 2018-07-06 16:27 Cavab Marco Pardo tərəfindən iyul ayının 06-də saat 16 : 27-də 2018-07-06 16:27 tarixində verilir

Seçdiyiniz cavabdan əlavə, əgər siz hələ də .NET35 və ya .NET35 CE istifadə edirsinizsə, dekode etmək üçün ilk baytın indeksini və dekode sayını təyin etməlisiniz:

 string result = System.Text.Encoding.UTF8.GetString(byteArray,0,byteArray.Length); 
0
01 февр. cavab Tuco 01 fevral. 2019-02-01 22:55 '19 saat 10:55 'da 2019-02-01 22:55

Bunu cəhd edin:

 string myresult = System.Text.Encoding.UTF8.GetString(byteArray); 
0
23 февр. Bill 23 fevralda verdiyi cavabı verdi 2018-02-23 03:43 '18 'də 3:43' də 2018-02-23 03:43 'də

Tags ilə bağlı digər suallar və ya bir sual