c# - single - string to array byte




Come convertire byte UTF-8[] in stringa? (9)

Ho una matrice di byte[] che viene caricata da un file che mi è capitato di conoscere contiene UTF-8 . In alcuni codici di debug, ho bisogno di convertirlo in una stringa. C'è un solo rivestimento che lo farà?

Sotto le copertine dovrebbe essere solo un'assegnazione e una memoria , quindi anche se non è implementata, dovrebbe essere possibile.


A mia conoscenza, nessuna delle risposte fornite garantisce un comportamento corretto con terminazione nulla. Fino a quando qualcuno non mi mostra diversamente ho scritto la mia classe statica per gestirlo con i seguenti metodi:

// 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);
}

Il motivo per startIndex era nell'esempio su cui stavo lavorando in particolare avevo bisogno di analizzare un byte[] come una matrice di stringhe terminate null. Può essere tranquillamente ignorato nel caso semplice


C'è anche la classe UnicodeEncoding, abbastanza semplice nell'uso:

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

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

In alternativa:

 var byteStr = Convert.ToBase64String(bytes);

La conversione di un byte[] in una string sembra semplice, ma è probabile che qualsiasi tipo di codifica comprometta la stringa di output. Questa piccola funzione funziona senza risultati imprevisti:

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

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

    return response;
}

Un linfoncino Linq per la conversione di una matrice di byte byteArrFilename letto da un file in una stringa ascii con terminazione zero in stile C puro sarebbe: Handy per la lettura di cose come le tabelle di indice dei file nei vecchi formati di archivio.

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

Io uso '?' come char predefinito per tutto ciò che non è puro ascii qui, ma che può essere cambiato, ovviamente. Se vuoi essere sicuro di poterlo rilevare, usa invece '\0' , poiché il TakeWhile all'inizio assicura che una stringa costruita in questo modo non possa contenere valori '\0' dall'origine di input.


Una soluzione generale per convertire dall'array di byte alla stringa quando non si conosce la codifica:

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

hier è un risultato in cui non dovevi preoccuparti della codifica. L'ho usato nella mia classe di rete e ho inviato oggetti binari come stringa con esso.

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

BitConverter classe BitConverter può essere utilizzata per convertire un byte[] in string .

var convertedString = BitConverter.ToString(byteAttay);

La documentazione della classe BitConverter può essere fonte su MSDN


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






type-conversion