2013-09-26 15 views
3

在c#中,我可以通过Encoding.UTF8.GetString()对二进制数据进行编码,然后再将其转换为,再回到binary = Encoding.UTF8.GetBytes()在c#中编码和解码安全吗?

我希望结果应该是我原来的二进制数据 - 无一例外。

但是在任何情况下都是如此吗?

还是取决于UTF8字符集的具体行为?

还是应该更好地使用Encoding.ASCII.GetString()Encoding.ASCII.GetBytes()

如果有人知道Encoding到底是什么(它如何处理特殊字符或特殊字节),那么请给我建议。

回答

5

在c#中,我可以通过Encoding.UTF8.GetString()编码二进制数据,然后通过binary = Encoding.UTF8.GetBytes()将其转换回来。

不,因为不是文本编码的东西

甲文字编码转换任意文本到/从结构化的字节(这意味着:在构成由该编码所定义的方式)

你有任意字节,而不是结构化的字节。您应该使用base-64(Convert.ToBase64String/Convert.FromBase64String),它将任意字节转换为结构化字符串/从结构化字符串转换 - 在这种情况下,根据base-64的规则进行结构化。

byte[] orig = ... 
string storeThis = Convert.ToBase64String(orig); 
// ... 
byte[] backAgain = Convert.FromBase64String(storeThis); 
+0

marc,但'somestring'和'somestring2'在这里应该总是一样的吧?因为我首先将其转换为'UTF8'? 'string somestring = ...; string somestring2 = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(somestring));' –

+0

@SriramSakthivel是的,但这是一个**不同的例子**。这不是问题描述的问题。问题描述的是:'byte [] somebytes = ...;字节somebytes2 = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(somebytes));' - 这是**没有**去工作 –

+0

我只是交叉检查我的理解是否正确,我知道我的问题是与OP要求的不同。谢谢马克 –

1

你应该只使用Encoding.UTF8,当你期望字节是UTF8编码。使用未知字节上的GetString()可能导致意外结果。

所以如果你使用Encoding.UTF8.GetBytes(“Hello world!”);你可以使用Encoding.UTF8.GetString(byteArray);