我准备了一个将输入字符串转换为二进制格式'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
方法返回Exception,因为它从StringToBinary
转换为14位(对于≤),而我尝试通过向左添加0来完成它到16位,它返回另一个字符串序列
任何人都有解决方案??
答案 0 :(得分:1)
您假设您可以安全地浏览char数组并从每个字符中获取单个字节。这是一个错误的假设。
相反,您需要在给定的编码中首先将字符串编码为字节数组。例如:
Encoding.Unicode.GetBytes(data);
然后,您可以安全地将每个字节转换为二进制文件。
另一方面,对于您读取的每8位,您将它们作为单个字节重新组合在一起,当您再次获得整个字节数组时,只需调用
Encoding.Unicode.GetString(byteData);
你已经完成了。
但是......为什么要将字符保存为二进制字符串?你真正试图解决的是什么问题?如果您正在尝试压缩等任何东西,那么您使用的效率非常低......如果您需要使用它来序列化数据,为什么不使用十六进制或Base-64编码?