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




.net arrays (10)

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

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


एक byte[] को एक string कनवर्ट करना सरल लगता है लेकिन किसी भी तरह का एन्कोडिंग आउटपुट स्ट्रिंग को गड़बड़ करने की संभावना है। यह छोटा फ़ंक्शन बस बिना किसी अप्रत्याशित परिणामों के काम करता है:

private string ToString(byte[] bytes)
{
    string response = string.Empty;

    foreach (byte b in bytes)
        response += (Char)b;

    return response;
}

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

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

परिभाषा:

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

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

string result = input.ConvertByteToString();

(byte)b.ToString("x2") का उपयोग करना (byte)b.ToString("x2") , आउटपुट 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;
    }

}

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

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

var convertedString = BitConverter.ToString(byteAttay);

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


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

 var byteStr = Convert.ToBase64String(bytes);

जब आप एन्कोडिंग नहीं जानते हैं तो बाइट सरणी से स्ट्रिंग में कनवर्ट करने का एक सामान्य समाधान:

static string BytesToStringConverted(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        using (var streamReader = new StreamReader(stream))
        {
            return streamReader.ReadToEnd();
        }
    }
}

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

  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

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

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

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





type-conversion