一尘不染

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

c#

如何转换stringbyte[]在.NET(C#),而无需手动指定一个特定的编码?

我将对字符串进行加密。我可以加密而不进行转换,但是我仍然想知道为什么编码在这里起作用。

另外,为什么还要考虑编码?我不能简单地获取字符串存储在哪个字节中?为什么要依赖字符编码?


阅读 240

收藏
2020-05-19

共1个答案

一尘不染

与这里的答案相反, 如果 不需要解释字节,则无需担心编码!

就像您提到的那样,您的目标很简单,就是 “获取字符串存储在哪个字节中”
(并且,当然,能够从字节中重建字符串。)

对于这些目标,老实说,我 明白为什么人们 总是 告诉您您需要编码。您当然不必为此担心编码。

只需这样做:

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

// Do NOT use on arbitrary bytes; only use on GetBytes's output on the SAME system
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);
}

只要您的程序(或其他程序)不尝试以某种方式 解释 字节(您显然没有提到您打算这样做),那么这种方法就 没有
错!无须担心编码,只会使您的生活变得更加复杂。

这种方法的其他好处:

字符串是否包含无效字符并不重要,因为您仍然可以获取数据并重建原始字符串!

因为您 只是在看bytes ,所以它的编码和解码都 一样

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

2020-05-19