【发布时间】:2014-02-13 16:33:44
【问题描述】:
我准备了一种将输入字符串转换为二进制格式'0'和'1'的方法:
public static string StringToBinary(string data)
{
StringBuilder sb = new StringBuilder();
char[] chararr = data.ToCharArray();
foreach (char c in data.ToCharArray())
{
string appendedStr = Convert.ToString(c, 2).PadLeft(8, '0');
sb.Append(appendedStr);
}
return sb.ToString();
}
将每个字符处理为 8 位的组成部分
然后我写了一个从二进制文件中恢复字符串的方法
public static string BinaryToString(string data)
{
List<Byte> byteList = new List<Byte>();
for (int i = 0; i < data.Length; i += 8)
{
byteList.Add(Convert.ToByte(data.Substring(i, 8), 2));
}
return Encoding.ASCII.GetString(byteList.ToArray());
}
这也将每 8 位作为一个字符处理,并且工作正常。
但是在我使用 (ψ , ≤ ,我认为所有特殊字符) 之类的字符的地方,它不起作用并从 BinaryToString 方法返回异常,因为它从 StringToBinary 转换为 14 位(对于 ≤ ),我尝试完成它向左加 0 到 16 位,返回另一个字符串序列
有人有解决办法吗??
【问题讨论】:
-
您需要了解 Unicode 编码。
-
XY problem...你真正想要完成什么?
-
.NET 字符串是 Unicode(16 位),而不是 8 位字节。 ASCII 绝对不能保证是系统使用的非 Unicode 格式,因为它由系统的区域设置控制。非程序员使用的非美国计算机肯定会使用每个国家/地区的代码页而不是 ASCII
-
@PanagiotisKanavos 这甚至有点复杂。单个 unicode 字符可以分布在 2 个字节以上。示例:
"čč".Normalize(NormalizationForm.FormKD)打印为čč,但ToCharArray为您提供cˇcˇ。两者都是相同的字符串,但具有不同的“内存”数据。这也使得比较 unicode 字符串有些棘手,因为它们不一定需要“字节相等”才能“字符相等”。
标签: c#