A weird thing in c# Encoding

后端 未结 6 1783
北海茫月
北海茫月 2020-12-11 21:52

I convert a byte array to a string , and I convert this string to byte array. these two byte arrays are different.

相关标签:
6条回答
  • 2020-12-11 22:16

    The ASCII character set has a range from 1 to 127. You can see 188 is not in this range and is converted to ? (= ASC 63).

    0 讨论(0)
  • 2020-12-11 22:19

    Not every sequence of bytes is necessarily a valid sequence of encoded values for a particular encoding.

    So the result of Encoding.ASCII.GetString(b) on an arbitrary array of bytes, b, is poorly defined. (And could be, for any other encoding also).

    If you need to take an arbitrary byte array and obtain a sequence of characters, you might want to look into the Convert classes ToBase64String and FromBase64String. If that's not what you're trying to do, maybe explain the original problem to us.

    0 讨论(0)
  • 2020-12-11 22:23

    188 isn't in the range of ASCII (7 bit), you should use Encoding.Default to get the ANSI encoding:

    byte[] b = new byte[3]{ 3, 188, 2 };
    byte[] tmp = Encoding.Default.GetBytes(Encoding.Default.GetString(b));
    
    0 讨论(0)
  • 2020-12-11 22:26

    The character 188 is not defined for ASCII. Instead, you're getting 63, which is a question mark.

    0 讨论(0)
  • 2020-12-11 22:31

    188 is out of range for ASCII. Characters that are not in the corresponding character set are transposed to '?' by design (would you prefer transposing to "1/4"?)

    0 讨论(0)
  • 2020-12-11 22:37

    ASCII is 7-bit only, so others are invalid. By default it uses ? to replace any invalid bytes and that's why you get a ?.

    For 8-bit character sets, you should be looking for either the Extended ASCII (which is later defined "ISO 8859-1") or the code page 437 (which is often confused with Extended ASCII, but in fact it's not).

    You can use the following code:

    Encoding enc = Encoding.GetEncoding("iso-8859-1");
    // For CP437, use Encoding.GetEncoding(437)
    byte[] tmp = enc.GetBytes(enc.GetString(b));
    
    0 讨论(0)
提交回复
热议问题