以位为单位编码字符串,2个问题

时间:2015-08-31 17:57:11

标签: c# string encoding char bit

我正在写一个程序。实际上核心功能运行良好,但我想升级它。我的问题在于字符串和位值之间的编码和转换。

首先,我通过

将字符串拆分为int值数组
    int[] bitValuesOfText = new int[Text.Length];
    for(int i = 0; i < Text.Length; i++)
        bitValuesOfText[i] = (int)Text[i];

然后我将数组中的所有值拆分为布尔值列表(如果字节的适当位置包含1,那么我添加true,否则为0)。然后我用这样的布尔列表做了更多的事情。

如果我想将这些位转换回字符串,问题就会出现。然后像ä,ę,à等奇怪的字母消失了。

反之,我只是添加每个8位(当然每个位都会产生相应的功率;我会迭代每个位)。

value += Int32.Parse(Math.Pow(2, (7 - (i % 8))).ToString());

我正在做的每8位

string += (char)value

我知道我必须使用某种编码,我尝试使用一些示例,但没有成功。我应该使用utf8或unicode吗?只是反向或两次转换之前?

此外,我考虑将其更改为字节类型,但我计划在此问题之后这样做。

1 个答案:

答案 0 :(得分:2)

当谈到在字节和字符之间进行转换时,您需要考虑编码。没有&#34;默认&#34;使用字节编码字符的方法,但是当你使用强制转换来强制解决问题时,.NET框架会进行非常粗略的UTF-16转换。在.NET程序中,如果要获得可预测的字节转换,则应调用Encoding对象。

非常重要的是,您使用相同类型的编码来写入和读取字节。如果您尝试读取使用不同编码编写的字符,您会发现它通常有效,但在某些情况下会失败。每当您在网页中看到�字符时,它就无法解码指定的字符,因为浏览器使用的编码与用于编码它的编码不同。

为了使用Encoding,理想情况下,您应该使用byte值流,以便编码可以使用多个字节来表示单个字符。如果您不需要表示大范围的字形,您可以使用非常简单的编码,如ASCII,但更完整的解决方案是使用Unicode编码(例如UTF-8)来实现更合理的范围。

您可能会发现The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) Joel Spolsky对此主题的阅读非常有用(并且很有趣)。

如果不更好地了解问题域,很难提供更具体的建议,但我会尝试创建Stream的实现,它允许使用您的stegeanographic技术读取和写入字节。这避免了数据编码的问题,因此您可以专注于读取和写入原始字节值。

如果您可以读取和写入字节流,则可以将它与大量的.NET类一起使用;几乎所有序列化,存储和网络组件都在Stream某个层面上运行。