如何在不手动指定特定编码的情况下将string
转换为. NET(C#)中的byte[]
?
我要加密字符串。我可以在不转换的情况下加密它,但我仍然想知道为什么编码在这里发挥作用。
另外,为什么要考虑编码?我不能简单地得到字符串存储的字节数吗?为什么依赖于字符编码?
就像你提到的那样,你的目标只是“获取字符串存储的字节数” 。
(当然,能够从字节中重新构造字符串。)
只需这样做:
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
static string GetString(byte[] bytes)
{
char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
}
只要你的程序(或其他程序)不试图以某种方式解释字节,你显然没有提到你打算这样做,那么这种方法没有任何问题!担心编码只会让你的生活更加复杂,没有真正的理由。
它将被编码和解码相同,因为您只是查看字节 。
但是,如果您使用了特定的编码,那么编码 / 解码无效字符会给您带来麻烦。
它取决于字符串的编码( 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来表示字符串,因此如果您只想获取. NET 使用的确切字节,请使用System.Text.Encoding.Unicode.GetBytes (...)
。
有关详细信息,请参阅.NET Framework 中的字符编码 (MSDN)。
接受的答案非常非常复杂。使用包含的. NET 类:
const string data = "A string with international characters: Norwegian: ÆØÅæøå, Chinese: 喂 谢谢";
var bytes = System.Text.Encoding.UTF8.GetBytes(data);
var decoded = System.Text.Encoding.UTF8.GetString(bytes);
如果你不需要,不要重新发明轮子......