因为一个Encoding
类不会只为任何事情工作。如果“字符”(在 UTF-8 的情况下可能是几个字节)在该特定字符集中(在您的情况下为 UTF-8)不是有效字符,它将使用替换字符。
一个问号 (U+003F)
(来源:http: //msdn.microsoft.com/en-us/library/ms404377.aspx#FallbackStrategy)
在某些情况下,它只是一个?
,例如在 ASCII/CP437/ISO 8859-1 中,但您可以选择如何处理它。(见上面的链接)
例如,如果您尝试转换(byte)128
为 ASCII:
string s = System.Text.Encoding.ASCII.GetString(new byte[] { 48, 128 }); // s = "0?"
然后将其转换回来:
byte[] b = System.Text.Encoding.ASCII.GetBytes(s); // b = new byte[] { 48, 63 }
你不会得到原始的字节数组。
这可以作为参考:检查字符是否存在于编码中
我无法想象为什么需要将字节数组转换为字符串。这显然没有任何意义。假设您要写入流,您可以直接写入byte[]
. yourIntegerVar.ToString()
如果您需要在某些文本表示中使用它,那么将它转换为字符串并使用int.TryParse
它来取回它是非常有意义的。
编辑:
您可以将字节数组写入文件,但您不会将字节数组“连接”到字符串并使用惰性方法,因为它将处理编码转换,并且您可能最终会出现File.WriteAllText
问号?
你的文件。相反,打开一个FileStream
并使用FileStream.Write
直接写入字节数组。或者,您可以使用 aBinaryWriter
直接写入二进制形式的整数(也可以是字符串),然后使用其对应项BinaryReader
将其读回。
例子:
FileStream fs;
fs = File.OpenWrite(@"C:\blah.dat");
BinaryWriter bw = new BinaryWriter(fs, Encoding.UTF8);
bw.Write((int)12345678);
bw.Write("This is a string in UTF-8 :)"); // Note that the binaryWriter also prefix the string with its length...
bw.Close();
fs = File.OpenRead(@"C:\blah.dat");
BinaryReader br = new BinaryReader(fs, Encoding.UTF8);
int myInt = br.ReadInt32();
string blah = br.ReadString(); // ...so that it can read it back.
br.Close();
此示例代码将生成一个与以下 hexdump 匹配的文件:
00 4e 61 bc 00 1c 54 68 69 73 20 69 73 20 61 20 73 Na¼..This is a s
10 74 72 69 6e 67 20 69 6e 20 55 54 46 2d 38 20 3a tring in UTF-8 :
20 29 )
请注意,BinaryWriter.Write(string)
还要在字符串前面加上它的长度,并且在回读时取决于它,因此不适合使用文本编辑器来编辑结果文件。(好吧,您正在以二进制形式写一个整数,所以我希望这是可以接受的?)