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

encoding string in bits, 2 questions

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

首先,我通过

将字符串拆分为 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 以及具体在哪个时刻?只是以相反的方式还是在两次转换之前?

我也考虑过改成byte类型,不过我打算在这个有问题的问题后改成byte类型

在谈论字节和字符之间的转换时,您需要考虑编码。没有 "default" 使用字节对字符进行编码的方法,但是当您使用强制转换强制解决此问题时,.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!) by Joel Spolsky 阅读本主题内容非常丰富(且有趣)。

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

如果您可以读写字节流,则可以将其与非常大量的 .NET 一起使用 类;几乎所有序列化、存储和网络组件都在某种程度上在 Stream 上工作。