我有一个byte[4]
的SizeOfData变量,它返回:
byte[0] == 0
byte[1] == 0
byte[2] == 0
byte[3] == 0
当我Encoding.ASCII.GetString(SizeOfData)
时,字符串变量的长度为4而String.IsNullOrEmpty()
返回false但是当我在Visual Studio中查看字符串时,其中没有任何内容。
如何确定它是否包含所有\ 0 \ 0 \ 0 \ 0然后执行X else Y?
答案 0 :(得分:4)
一点点linq魔法
if (bytes.All(b => b == 0))
或稍好一点
if (bytes.Any(b => b != 0))
答案 1 :(得分:2)
当我在Visual Studio中查看字符串时,其中没有任何内容
你的意思是,我假设,当你将鼠标悬停在调试器中的字符串上(或添加一个手表,或检查本地,或以其他方式查看字符串的可视化表示)时,它似乎是空。这是因为\0
和其他一些字符一样,是一个不可打印的字符。这些字符在那里,但它们不会产生视觉效果。
如果你想确定字节数组是否只有零,那很简单:
(请注意,上面的数组名称无效,因此我将其称为data
)
if(data.Add(b => b == 0))
{
// is only null characters
}
然而,似乎你想要一些更强大的东西,以及可以在字符串上工作的东西。您可以使用简单的RegEx替换不可打印的Unicode字符范围(原始字符串,如ASCII,我知道,但一旦解析它,它内部存储为UTF-16):
yourString = Regex.Replace(yourString, "[\x00-\x1F]", "");
此时,string.IsNullOrEmpty(yourString)
应返回true
。
答案 2 :(得分:1)
在转换为字符串之前,你可以:
bool isNulls = SizeOfData.All(x => x == 0);
答案 3 :(得分:0)
如果你可以提前处理它,你可以检查字节数组:
if(SizeOfData.Any(b => b != 0))
// do something
else
// do something else