c# - parse - string to byte online




Comment convertir un octet UTF-8[] en chaîne? (8)

À ma connaissance, aucune des réponses données ne garantit un comportement correct avec une terminaison nulle. Jusqu'à ce que quelqu'un me montre différemment, j'ai écrit ma propre classe statique pour gérer cela avec les méthodes suivantes:

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

La raison de startIndex était dans l'exemple sur lequel je travaillais spécifiquement que j'avais besoin d'analyser un byte[] sous la forme d'un tableau de chaînes terminées nulles. Il peut être ignoré sans risque dans le cas simple

J'ai un tableau d' byte[] qui est chargé à partir d'un fichier que je connais connu contient UTF-8 . Dans un code de débogage, j'ai besoin de le convertir en une chaîne. Y a-t-il un seul paquebot qui va le faire?

Sous les couvertures, il ne devrait s'agir que d'une allocation et d'un mémo , donc même si ce n'est pas le cas, cela devrait être possible.


Alternativement:

 var byteStr = Convert.ToBase64String(bytes);

Essaye ça:

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

Il y a au moins quatre manières différentes de faire cette conversion.

  1. Encoding's GetString
    , mais vous ne pourrez pas récupérer les octets d'origine si ces octets ont des caractères non-ASCII.

  2. BitConverter.ToString
    La sortie est une chaîne délimitée par "-", mais il n'y a pas de méthode intégrée .NET pour convertir la chaîne en tableau d'octets.

  3. Convert.ToBase64String
    Vous pouvez facilement convertir la chaîne de sortie en tableau d'octets en utilisant Convert.FromBase64String .
    Remarque: La chaîne de sortie peut contenir '+', '/' et '='. Si vous souhaitez utiliser la chaîne dans une URL, vous devez l'encoder explicitement.

  4. HttpServerUtility.UrlTokenEncode
    Vous pouvez facilement convertir la chaîne de sortie en tableau de byte en utilisant HttpServerUtility.UrlTokenDecode . La chaîne de sortie est déjà compatible avec les URL! L'inconvénient est qu'il a besoin de l'assembly System.Web si votre projet n'est pas un projet web.

Un exemple complet:

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

Un doublure Linq pour convertir un tableau d'octets byteArrFilename lu à partir d'un fichier en une chaîne terminée par un zéro de style C ascii pur serait ceci: Pratique pour lire des choses comme des tables d'index de fichiers dans les anciens formats d'archives.

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

J'utilise '?' comme char par défaut pour tout ce qui n'est pas pur ascii ici, mais cela peut être changé, bien sûr. Si vous voulez être sûr de pouvoir le détecter, utilisez '\0' place, puisque le TakeWhile au début s'assure qu'une chaîne construite de cette manière ne peut pas contenir '\0' valeurs '\0' de la source d'entrée.


Une solution générale pour convertir un tableau d'octets en chaîne lorsque vous ne connaissez pas l'encodage:

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

BitConverter classe BitConverter peut être utilisée pour convertir un byte[] en string .

var convertedString = BitConverter.ToString(byteAttay);

La documentation de la classe BitConverter peut être trouvée sur MSDN


Définition:

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

En utilisant:

string result = input.ConvertByteToString();




type-conversion