用比特编码字符串,2个问题

本文关键字:2个 问题 字符串 编码字符 编码 | 更新日期: 2023-09-27 18:10:30

我正在写一个程序。其实核心功能很好,但是我想升级一下。我的问题是在字符串和位值之间的编码和转换。

首先我用

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

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

如果我想将位转换回字符串,问题就开始了。然后奇怪的字母,如ä, z, com等就消失了。

在相反的方式上,我只是将每8位(当然每个位都使适当的功率;我迭代每个位)。

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

每8位我做一次

string += (char)value

我知道我必须使用某种编码,我试着用一些例子来做,但没有成功。我应该使用utf8还是unicode,具体在什么时候使用?只是以相反的方式还是在两个转换之前?

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

用比特编码字符串,2个问题

在讨论字节和字符之间的转换时,您需要考虑编码。没有使用字节编码字符的"默认"方式,但是当您使用强制转换时,. net框架会进行非常粗糙的UTF-16转换。在。net程序中,如果你想获得可预测的字节转换,你应该调用Encoding对象。

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

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

你可能会发现Joel Spolsky的《每个软件开发人员绝对必须知道的关于Unicode和字符集的绝对最低限度(没有借口!)》是一本关于这个主题的非常有见地(和有趣)的读物。

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

如果你可以读写一个字节流,你可以在大量的。net类中使用它;几乎所有的序列化、存储和网络组件在某种程度上都是在Stream上工作的。