C# 为什么两个字符相同的字符串在比较时不返回0?

C# 为什么两个字符相同的字符串在比较时不返回0?,c#,string,serial-port,compare,C#,String,Serial Port,Compare,大家好,我正在比较两个字符串。str1从串行端口读取,str2是引用字符串。代码: string str1 , str2 = "Foo"; serialPort1.Open(); str1 = serialPort1.ReadLine(); //I get "Foo" on the serial port. if (String.Compare(str1,str2) == 0) { //do something } 因此字符串具有相同的值,但if语句中的代码不会运行。 如果我像这

大家好,我正在比较两个字符串。str1从串行端口读取,str2是引用字符串。代码:

string str1 , str2 = "Foo";
serialPort1.Open();
str1 = serialPort1.ReadLine(); //I get "Foo" on the serial port.

if (String.Compare(str1,str2) == 0)
{ 
     //do something
}
因此字符串具有相同的值,但if语句中的代码不会运行。 如果我像这样更改If语句:

if (String.Compare(str1,str2) != 0)
{ 
     //do something
}

代码将完美运行!所以我不明白这里怎么了?编码有问题吗?

您可以使用Equals进行比较

就你而言:

if(str1.Equals(str2))
{
    //do stuff
}
else
{
    //do other stuff
}

也许最好打印字符串,看看值实际上是什么。也许他们真的不一样

您可以按如下方式显示字符串内容:

dump(System.Text.Encoding.UTF8.GetBytes(str1)) ;
dump(System.Text.Encoding.UTF8.GetBytes(str2)) ;
dump(System.Text.ASCIIEncoding.Default.GetBytes(str1)) ;
dump(System.Text.ASCIIEncoding.Default.GetBytes(str2)) ;

private void dump(byte[] bytes)
{ // HexaDecimal display
  console.writeln(BitConverter.ToString(bytes)) ;
}

您确定从串行端口获取的数据不包含特殊字符,并且使用了正确的编码吗?请尝试使用ifstr1.Trim==str2.Trim来验证间距问题,您还可以比较长度。@涂鸦:我还没有更改编码,实际上一切都是默认方式。@cDima:我尝试过,它仍然不工作,我不明白为什么会有空间?谢谢你检查了str1的长度了吗?对于Foo,它是否如您所期望的那样等于3?为了将来的参考,您可以通过在代码前后添加`字符来格式化代码,例如:code here,或者选择并按Ctrl-KThanks man这是一个很好的提示,我很感激,我从串口得到的字符串是46-6F-6F-0D,我的参考十六进制代码是46-6F-6F。那么0D十六进制代表什么呢?那显然不是一个空间。。。我现在该怎么办?0D是回车。在ReadLine之后,执行str1=str1.Replace\r@J.Doe-别忘了将答案标记为已接受的答案,以防它帮助您解决问题。@Graffito-是的,它有效…谢谢!如何直接使用十六进制代码而不是回车符来进行替换?@Yakimych:我应该如何将其标记为答案?我不知道!