协慌网

登录 贡献 社区

如何在不手动指定编码的情况下在 C#中获得字符串的一致字节表示?

如何在不手动指定特定编码的情况下将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);
}

只要你的程序(或其他程序)不试图以某种方式解释字节,你显然没有提到你打算这样做,那么这种方法没有任何问题!担心编码只会让你的生活更加复杂,没有真正的理由。

这种方法的其他好处:

字符串包含无效字符无关紧要,因为无论如何您仍然可以获取数据并重建原始字符串!

它将被编码和解码相同,因为您只是查看字节

但是,如果您使用了特定的编码,那么编码 / 解码无效字符会给您带来麻烦。

它取决于字符串的编码( ASCIIUTF-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);

如果你不需要,不要重新发明轮子......