【发布时间】:2011-03-19 14:07:59
【问题描述】:
全部,
我有一个关于将带有空值的字节数组转换为 C# 字符串的问题。 这是我想转换为字符串的字节数组的示例。 我希望得到一个值为 SHkV 的字符串
[0]: 83
[1]: 0
[2]: 72
[3]: 0
[4]: 75
[5]: 0
[6]: 86
[7]: 0
如何在 C# 中做到这一点?
谢谢, MK
【问题讨论】:
全部,
我有一个关于将带有空值的字节数组转换为 C# 字符串的问题。 这是我想转换为字符串的字节数组的示例。 我希望得到一个值为 SHkV 的字符串
[0]: 83
[1]: 0
[2]: 72
[3]: 0
[4]: 75
[5]: 0
[6]: 86
[7]: 0
如何在 C# 中做到这一点?
谢谢, MK
【问题讨论】:
假设 ASCII 字节,您可以使用 LINQ:
new string(bytes.Where(b => b != 0).Select(b => (char)b).ToArray());
但是,我怀疑您正在尝试破解 Unicode 数据。
不要。
改为使用Encoding class。
【讨论】:
string str = new ASCIIEncoding().GetString(bytes.Where(i => i != 0).ToArray());
您也可以使用UnicodeEncoding、UTF32Encoding、UTF7Encoding 或UTF8Encoding
【讨论】:
您确实需要知道原始编码才能成功转换。
我怀疑在这种情况下编码可能是UTF-16,您可以将其转换如下:
byte[] yourByteArray = new byte[] { 83, 0, 72, 0, 75, 0, 86, 0 };
string yourString = Encoding.Unicode.GetString(yourByteArray));
Console.WriteLine(yourString); // SHKV
【讨论】:
使用 Linq 语法:
var chars =
from b in byteArray
where b != 0
select (char) b;
string result = new String(chars.ToArray());
尽管您最好选择正确的编码,正如其他人所建议的那样。
【讨论】:
这看起来像 little-endian UTF-16,所以:
string s = Encoding.Unicode.GetString(data);
【讨论】:
您能保证始终看到这种编码的字符串(char、null、char、null 等)吗?如果是这样,您可以简单地使用 Unicode 字符串编码器对其进行解码:
Byte[] contents = new Byte[] {83, 0, 72, 0, 75, 0, 86, 0};
Console.WriteLine(System.Text.Encoding.Unicode.GetString(contents));
【讨论】:
字节[] b = 新字节[]{83,0,72,0,75,0,86,0};
System.Text.Encoding.Unicode.GetString(b);
【讨论】: