[C#] UTF-8 바이트 []를 문자열로 변환하는 방법?

나는이 byte[]내가 알고 일이있는 파일에서로드되는 배열은 포함 UTF-8 .

일부 디버깅 코드에서는 문자열로 변환해야합니다. 이것을 할 하나의 라이너가 있습니까?

표지 아래에는 할당 및 memcopy 일뿐 이므로 구현되지 않더라도 가능해야합니다.



답변

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


답변

이 전환을 수행하는 방법에는 적어도 네 가지가 있습니다.

  1. 인코딩의 GetString
    이지만 ASCII가 아닌 문자가있는 바이트는 원래 바이트를 되돌릴 수 없습니다.

  2. BitConverter.ToString
    출력은 “-“로 구분 된 문자열이지만 문자열을 바이트 배열로 다시 변환하는 .NET 기본 제공 방법은 없습니다.

  3. Convert.ToBase64String
    을 사용하여 출력 문자열을 바이트 배열로 쉽게 변환 할 수 있습니다 Convert.FromBase64String.
    참고 : 출력 문자열에는 ‘+’, ‘/’및 ‘=’이 포함될 수 있습니다. URL에서 문자열을 사용하려면 명시 적으로 인코딩해야합니다.

  4. HttpServerUtility.UrlTokenEncode
    을 사용하여 출력 문자열을 바이트 배열로 쉽게 변환 할 수 있습니다 HttpServerUtility.UrlTokenDecode. 출력 문자열은 이미 URL 친화적입니다! 단점은 System.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


답변

인코딩을 모르는 경우 바이트 배열에서 문자열로 변환하는 일반적인 솔루션 :

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


답변

정의:

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

사용 :

string result = input.ConvertByteToString();


답변

를 a byte[]로 변환하는 string것은 간단 해 보이지만 모든 종류의 인코딩은 출력 문자열을 망칠 수 있습니다. 이 작은 기능은 예기치 않은 결과없이 작동합니다.

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

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

    return response;
}


답변

(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;
    }

}


답변

사용법이 매우 간단한 UnicodeEncoding 클래스도 있습니다.

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

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