问题
I get strange results when converting byte array to string and then converting the string back to byte array.
Try this:
byte[] b = new byte[1];
b[0] = 172;
string s = Encoding.ASCII.GetString(b);
byte[] b2 = Encoding.ASCII.GetBytes(s);
MessageBox.Show(b2[0].ToString());
And the result for me is not 172 as I'd expect but... 63.
Why does it happen?
回答1:
Why does it happen?
Because ASCII only contains values up to 127.
When faced with binary data which is invalid for the given encoding, Encoding.GetString
can provide a replacement character, or throw an exception. Here, it's using a replacement character of ?
.
It's not clear exactly what you're trying to achieve, but:
- If you're converting arbitrary binary data to text, use Convert.ToBase64String instead; do not try to use an encoding, as you're not really representing text. You can use Convert.FromBase64String to then decode.
Encoding.ASCII
is usually a bad choice, and certainly binary data including a byte of 172 is not ASCII text- You need to work out which encoding you're actually using. Personally I dislike using
Encoding.Default
unless you really know the data is in the default encoding for the platform you're working on. If you get the choice, using UTF-8 is a good one.
回答2:
ASCII encoding is a 7-bit encoding. If you take a look into generated string it contains "?" - unrecognized character. You might choose Encoding.Default instead.
回答3:
ASCII is a seven bit character encoding, so 172 falls out of that range, so when converting to a string, it converts to "?" which is used for characters that cannot be represented.
来源:https://stackoverflow.com/questions/19451021/strange-results-when-converting-from-byte-array-to-string