2013-07-24 89 views
4

任何人都可以告诉我这里发生了什么?转换字节数组 - >字符串 - >字节数组损坏数据

 byte[] stamp = new byte[]{0,0,0,0,0,1,177,115}; 
     string serialize = System.Text.Encoding.UTF8.GetString(stamp); 
     byte[] deserialize = System.Text.Encoding.UTF8.GetBytes(serialize); 

     //deserialize == byte[]{0,0,0,0,0,1,239,191,189,115} 

为什么是stamp!=反序列化?

+1

你确定他们还不是**相同的字符串**吗?编码不需要保存原始字节... –

+0

它们可能是相同的字符串,但我正在使用SQL时间戳,所以我关心字节,而不是字符串... –

回答

5

在你的原始字节数组中,你有177字符,它是plusminus的符号。但是,在序列化过程中,该代码无法识别。它正在替换为239 191 189这是替换字符。

以下是供参考的图表。 http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&utf8=dec

我不太清楚为什么plusminus符号不被识别,但这就是为什么字节数组不相等。除了交换之外,它们会相同,并且数据不会以任何方式损坏。

+0

啊......有道理......谢谢! –

+1

好问题,它让我思考并阅读它。这是一个有趣的问题! –

4

字节数组不能编码UTF-8中的有效文本字符串,所以当您“序列化”它时,无法识别的部分将被替换为“替换字符”。如果你必须将字节数组转换为字符串,你应该找到一个没有像这样的限制的编码,比如ISO-8859-1。

特别是,字节177不能以有效的UTF-8单独出现:范围128-191中的字节是仅在范围194-244中的字节出现之后才出现的“连续字节”。你可以在这里了解更多关于UTF-8的信息:https://en.wikipedia.org/wiki/UTF-8

+0

这个表是什么意思http://www.utf8-chartable.de/unicode-utf8-table.pl?start=128&utf8=dec? –

+1

它似乎是从U + 0080到U + 017F的Unicode字符表,以及它们如何以UTF-8编码以及它们的含义。例如,U + 00F8被称为拉丁小写字母O WITH STROKE,在UTF-8中它被编码为(195,184),这就是它的样子:ø – Joni

+0

完美,谢谢! –

相关问题