c# - यूटीएफ-8 बाइट[] को स्ट्रिंग में कैसे परिवर्तित करें?




.net arrays (8)

मेरे पास एक byte[] सरणी है जो फ़ाइल से लोड की जाती है जिसे मुझे ज्ञात होता है जिसमें UTF-8 होता है। कुछ डिबगिंग कोड में, मुझे इसे एक स्ट्रिंग में कनवर्ट करने की आवश्यकता है। क्या कोई एक लाइनर है जो यह करेगा?

कवर के तहत यह केवल एक आवंटन और एक मेमोपी होना चाहिए, इसलिए यदि इसे कार्यान्वित नहीं किया जाता है, तो यह संभव होना चाहिए।


इस रूपांतरण को कम से कम चार अलग-अलग तरीके हैं।

  1. एन्कोडिंग की गेटस्ट्रिंग
    , लेकिन यदि आप बाइट्स में गैर-ASCII वर्ण हैं तो आप मूल बाइट्स वापस प्राप्त नहीं कर पाएंगे।

  2. BitConverter.ToString
    आउटपुट एक "-" सीमित स्ट्रिंग है, लेकिन स्ट्रिंग को बाइट सरणी में कनवर्ट करने के लिए कोई .NET अंतर्निहित विधि नहीं है।

  3. Convert.ToBase64String
    Convert.FromBase64String का उपयोग करके आप आसानी से आउटपुट स्ट्रिंग को बाइट सरणी में परिवर्तित कर सकते हैं।
    नोट: आउटपुट स्ट्रिंग में '+', '/' और '=' हो सकता है। यदि आप किसी URL में स्ट्रिंग का उपयोग करना चाहते हैं, तो आपको इसे स्पष्ट रूप से एन्कोड करना होगा।

  4. HttpServerUtility.UrlTokenEncode
    आप HttpServerUtility.UrlTokenDecode का उपयोग कर आउटपुट स्ट्रिंग को बाइट सरणी में आसानी से परिवर्तित कर सकते हैं। आउटपुट स्ट्रिंग पहले ही यूआरएल अनुकूल है! अगर आपकी परियोजना एक वेब प्रोजेक्ट नहीं है तो नकारात्मकता को System.Web .Web असेंबली की आवश्यकता है।

एक पूर्ण उदाहरण:

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

इसे इस्तेमाल करे:

string myresult = System.Text.Encoding.UTF8.GetString(byteArray);

एक बाइट सरणी byteArrFilename को कनवर्ट करने के लिए एक लिंक एक-लाइनर एक फ़ाइल से शुद्ध byteArrFilename सी-शैली शून्य-समाप्त स्ट्रिंग में पढ़ा जाएगा: पुराने संग्रह प्रारूपों में फ़ाइल इंडेक्स टेबल जैसी चीज़ों को पढ़ने के लिए सुविधाजनक।

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

मैं '?' उपयोग करता हूँ यहां कुछ भी शुद्ध एसीआईआई के लिए डिफ़ॉल्ट चार के रूप में नहीं है, लेकिन यह निश्चित रूप से बदला जा सकता है। यदि आप यह सुनिश्चित करना चाहते हैं कि आप इसका पता लगा सकते हैं, तो इसके बजाय '\0' उपयोग करें, क्योंकि शुरुआत में TakeWhile यह सुनिश्चित करता है कि इस तरह से बनाई गई स्ट्रिंग में संभवतः इनपुट स्रोत से '\0' मान नहीं हो सकते हैं।


क्लास यूनिकोड एन्कोडिंग भी है, उपयोग में काफी सरल है:

ByteConverter = new UnicodeEncoding();
string stringDataForEncoding = "My Secret Data!";
byte[] dataEncoded = ByteConverter.GetBytes(stringDataForEncoding);

Console.WriteLine("Data after decoding: {0}", ByteConverter.GetString(dataEncoded));

मेरे ज्ञान के लिए दिए गए उत्तरों में से कोई भी शून्य समाप्ति के साथ सही व्यवहार की गारंटी नहीं देता है। जब तक कोई मुझे अलग दिखाता है तब तक मैंने निम्नलिखित विधियों के साथ इसे संभालने के लिए अपनी खुद की स्थैतिक कक्षा लिखी:

// 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 का कारण उदाहरण में था कि मैं विशेष रूप से काम कर रहा था, मुझे एक byte[] को निरस्त समाप्त तारों की एक सरणी के रूप में पार्स करने की आवश्यकता थी। इसे सरल मामले में सुरक्षित रूप से अनदेखा किया जा सकता है


वैकल्पिक रूप से:

 var byteStr = Convert.ToBase64String(bytes);

BitConverter क्लास का उपयोग byte[] को string बदलने के लिए किया जा सकता है।

var convertedString = BitConverter.ToString(byteAttay);

BitConverter वर्ग का दस्तावेज़ीकरण BitConverter पर BitConverter हो सकता है


परिभाषा:

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

का उपयोग करते हुए:

string result = input.ConvertByteToString();





type-conversion