c# - 为什么 byte[] to string and back 不能按预期工作

标签 c# byte

我有这个代码:

Int32 i1 = 14000000;
byte[] b = BitConverter.GetBytes(i1);
string s = System.Text.Encoding.UTF8.GetString(b);
byte[] b2 = System.Text.Encoding.UTF8.GetBytes(s);
Int32 i2 = BitConverter.ToInt32(b2,0);;

i2 等于 -272777233。 为什么不是输入值? (14000000) ?

编辑:我想做的是将它附加到另一个字符串,然后我使用 WriteAllText 将其写入文件

最佳答案

因为 Encoding 类不会只对任何东西起作用。如果“字符”(在 UTF-8 的情况下可能是几个字节)在该特定字符集(在您的情况下为 UTF-8)中不是有效字符,它将使用替换字符

a single QUESTION MARK (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 }

您将不会得到原始字节数组。

这个可以引用:Check if character exists in encoding


我无法想象为什么您需要将字节数组转换为字符串。这显然没有任何意义。假设您要写入一个流,您可以直接写入 byte[]。如果您需要在某些文本表示中使用它,通过 yourIntegerVar.ToString() 将其转换为字符串并使用 int.TryParse 获取它是非常有意义的回来。


编辑:

可以将字节数组写入文件,但您不会将字节数组“连接”为字符串并使用惰性方法File.WriteAllText因为它将处理编码转换,您最终可能会在整个文件中看到问号 ?。相反,打开一个 FileStream 并使用 FileStream.Write 直接写入字节数组。或者,您可以使用 BinaryWriter 直接以二进制形式(以及字符串)写入一个整数,然后使用其对应的 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();

此示例代码将生成一个与以下十六进制转储匹配的文件:

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) 还为字符串加上长度前缀,它在回读时取决于它,因此不适合使用文本编辑器来编辑生成的文件。 (好吧,你写的是二进制形式的整数,所以我认为这是可以接受的?)

关于c# - 为什么 byte[] to string and back 不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14168025/

相关文章:

c# - 如何用一个空格替换多个空格

c# - 将 Base64 值转换为数字

java - 使用 Cp500(LF 和 NEL)编码陌生度

java - 从原始字节获取 EVDEV 事件代码?

c# - .Net 缓存过期

c# - WCF 超时的最大值是多少?

java - 将 Java 方法 Base64.encodeToString() 转换为 PHP

Java 无符号字节 [2] 到 int?

c# - 最小起订量和参数匹配

c - 一次从一个结构中读取字节