Πώς μπορώ να μετατρέψω μια string
σε byte[]
στο .NET (C#) χωρίς να καθορίσω χειροκίνητα μια συγκεκριμένη κωδικοποίηση;
Θα κρυπτογραφήσω το αλφαριθμητικό. Μπορώ να το κρυπτογραφήσω χωρίς μετατροπή, αλλά θα ήθελα ακόμα να ξέρω γιατί η κωδικοποίηση μπαίνει στο παιχνίδι εδώ.
Επίσης, γιατί πρέπει να λαμβάνεται υπόψη η κωδικοποίηση; Δεν μπορώ απλά να πάρω σε ποια bytes έχει αποθηκευτεί η συμβολοσειρά; Γιατί υπάρχει εξάρτηση από την κωδικοποίηση χαρακτήρων;
Εξαρτάται από την κωδικοποίηση της συμβολοσειράς σας (ASCII, UTF-8, ...).
Για παράδειγμα:
byte[] b1 = System.Text.Encoding.UTF8.GetBytes (myString);
byte[] b2 = System.Text.Encoding.ASCII.GetBytes (myString);
Ένα μικρό δείγμα γιατί η κωδικοποίηση έχει σημασία:
string pi = "\u03a0";
byte[] ascii = System.Text.Encoding.ASCII.GetBytes (pi);
byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (pi);
Console.WriteLine (ascii.Length); //Will print 1
Console.WriteLine (utf8.Length); //Will print 2
Console.WriteLine (System.Text.Encoding.ASCII.GetString (ascii)); //Will print '?'
Η ASCII απλά δεν είναι εξοπλισμένη για να αντιμετωπίσει ειδικούς χαρακτήρες.
Εσωτερικά, το πλαίσιο .NET χρησιμοποιεί UTF-16 για την αναπαράσταση συμβολοσειρών, οπότε αν θέλετε απλώς να λάβετε τα ακριβή bytes που χρησιμοποιεί το .NET, χρησιμοποιήστε System.Text.Encoding.Unicode.GetBytes (...)
.
Ανατρέξτε στην ενότητα Κωδικοποίηση χαρακτήρων στο .NET Framework (MSDN) για περισσότερες πληροφορίες.
// C# to convert a string to a byte array.
public static byte[] StrToByteArray(string str)
{
System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding();
return encoding.GetBytes(str);
}
// C# to convert a byte array to a string.
byte [] dBytes = ...
string str;
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
str = enc.GetString(dBytes);