【问题标题】:System.Text.Encoding.Default.GetString(byte[]) results for 0 valuesSystem.Text.Encoding.Default.GetString(byte[]) 结果为 0 个值
【发布时间】:2015-07-25 00:43:20
【问题描述】:

将字节数组转换为字符串时,我正在使用类似的东西

byte[] src = new byte[5] { 65, 66, 67, 0, 0 };
string s = System.Text.Encoding.Default.GetString(src);

(另见此处:How to convert byte[] to string?

但是,如果字节数组在某些位置包含 0 值(例如,在末尾,因为预期的字符串不够长),则生成的字符串也包含 '\0' 字符。他们甚至计算 string.Length。上例结果为“ABC\0\0”,长度为5。

这样的字符串是可打印的,但 Console.Writeline 似乎在这样的字符串之后出现换行问题。由于“隐藏”“\0”字符(“ABC”!=“ABC\0\0”),将此字符串与“真实”字符串进行比较可能会产生意想不到的结果。

由于我目前仅将其用于调试输出,因此我的解决方法是 Trim() 尾随 '\0' 字符。有没有更好的方法来摆脱这种情况,也许是不同的编码器或不同的转换方法?

【问题讨论】:

标签: c# .net string character-encoding bytearray


【解决方案1】:

那么,为什么不直接将这些\0 从您的数组中丢弃,然后再转换为字符串呢?
C# 中的字符串不是以 null 结尾的,因此没有理由保留任何 \0

例如,通过使用 Linq:

string s = System.Text.Encoding.Default.GetString(src.Where(x => x != 0).ToArray());

【讨论】:

  • 是的,当然。问题是:是否有一个编码器已经这样做了?因为它已经在处理字节数组了。
  • 默认编码器和 Ascii 编码器(试过这个)返回的字符串不是很“标准”,因为它们可能包含 \0,即使在字符串的中间。
  • @Cpt.Obvious 不确定我现在是否理解你。在将此数组编码为字符串之前,您是否尝试在源数组中的任何位置删除 0 字节?如果是 - 我已经向您展示了一种可能的方法。或者您正在尝试完成其他任务?
  • 我需要从A\0BC得到这个A如何得到它?
  • @AndreiKrasutski 这取决于您的确切要求。如果您在第一次出现 \0 char 之前需要严格的字符 - 您可以使用 string.IndexOfstring.Substring 或类似的东西。
猜你喜欢
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2019-05-26
  • 2015-12-28
相关资源
最近更新 更多