web-dev-qa-db-ja.com

UTF-8 byte []を文字列に変換する方法

私はたまたま知っているファイルからロードされたbyte[]配列を持っています UTF-8 。一部のデバッグコードでは、文字列に変換する必要があります。これを行う1つのライナーはありますか?

カバーの下では、それは単に割り当てと memcopy であるべきです、それでそれが実行されなくても、それは可能であるべきです。

833
BCS
string result = System.Text.Encoding.UTF8.GetString(byteArray);
1299
Zanoni

この変換には少なくとも4つの異なる方法があります。

  1. エンコーディングのGetString
    ただし、それらのバイトに非ASCII文字が含まれていると、元のバイトを取り戻すことはできません。

  2. BitConverter.ToString
    出力は " - "で区切られた文字列ですが、文字列をバイト配列に戻す.NET組み込みメソッドはありません。

  3. Convert.ToBase64String
    Convert.FromBase64Stringを使うと、出力文字列を簡単にバイト配列に戻すことができます。
    注:出力文字列には、「+」、「/」、および「=」を含めることができます。 URLで文字列を使用したい場合は、それを明示的にエンコードする必要があります。

  4. HttpServerUtility.UrlTokenEncode
    HttpServerUtility.UrlTokenDecodeを使うと、出力文字列を簡単にバイト配列に戻すことができます。出力文字列はすでにURLフレンドリです。欠点は、プロジェクトがWebプロジェクトではない場合は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
292
detale

エンコーディングがわからないときにバイト配列から文字列に変換する一般的な方法 

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

定義:

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

使用方法:

string result = input.ConvertByteToString();
12

byte[]stringに変換するのは簡単に思えますが、どんな種類のエンコーディングでも出力文字列をめちゃくちゃにしてしまうでしょう。この小さな機能は、予期しない結果を招くことなく機能します。 

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

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

    return response;
}
9
AndrewJE

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

}
8
metadings

使い方が非常に簡単なUnicodeEncodingクラスもあります。

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

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

あるいは

 var byteStr = Convert.ToBase64String(bytes);
2
Fehr

私の知る限りでは、与えられた答えのどれもがnull終端で正しい振る舞いを保証するものではありません。誰かが私に違ったことを見せるまで、私はこれを扱うために私自身の静的クラスを次のメソッドで書きました:

// 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[]をヌル終端文字列の配列として解析する必要がありました。単純な場合は無視して構いません。

2
Assimilater

BitConverterクラスはbyte[]stringに変換するために使用できます。

var convertedString = BitConverter.ToString(byteAttay);

BitConverterクラスのドキュメントは _ msdn _ にあります。

2
Sagar

ファイルから読み込んだバイト配列byteArrFilenameを純粋なASCII Cスタイルのゼロで終わる文字列に変換するためのLinqのワンライナーはこれでしょう:古いアーカイブフォーマットのファイルインデックステーブルのようなものを読むのに便利です。

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

ここでは純粋なASCIIではなく、'?'をデフォルトの文字として使用していますが、もちろん変更することもできます。確実に検出できるようにしたい場合は、代わりに'\0'を使用してください。開始時のTakeWhileは、この方法で作成された文字列に入力ソースからの'\0'値を含めることができないためです。

2
Nyerguds

選択した回答に加えて、.NET35または.NET35 CEを使用している場合は、デコードする最初のバイトのインデックスとデコードするバイト数を指定する必要があります。

string result = System.Text.Encoding.UTF8.GetString(byteArray,0,byteArray.Length);
0
The One

hierはエンコーディングを気にする必要がなかった結果です。私は自分のネットワーククラスでそれを使用し、それと共に文字列としてバイナリオブジェクトを送信しました。

        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
Marco Pardo

これを試して:

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