Reputation: 3451
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?
Upvotes: 2
Views: 2360
Reputation: 38130
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.
Upvotes: 1
Reputation: 146
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.
Upvotes: 3
Reputation: 1499770
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:
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 textEncoding.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.Upvotes: 6