C# 如果条件未按预期评估

C# 如果条件未按预期评估,c#,C#,我对VisualStudio和C#还不熟悉,但我的问题似乎很简单,但我无法解决。我有一个二进制文件,我在读,我试图处理它或多或少一个字节的时间。问题是,当我在“if”条件中得到几个字节时,在它应该为FALSE之后很长一段时间,它的计算结果似乎为TRUE 下面是输入二进制文件的快速jist,因此下面的代码很有意义 字节[0-3]:前导码 字节[4]:消息类型 字节[5-7]:消息长度 字节[8-11]:测试ID 和一段代码 file = openFileDialog1.FileName

我对VisualStudio和C#还不熟悉,但我的问题似乎很简单,但我无法解决。我有一个二进制文件,我在读,我试图处理它或多或少一个字节的时间。问题是,当我在“if”条件中得到几个字节时,在它应该为FALSE之后很长一段时间,它的计算结果似乎为TRUE

下面是输入二进制文件的快速jist,因此下面的代码很有意义

字节[0-3]:前导码
字节[4]:消息类型
字节[5-7]:消息长度
字节[8-11]:测试ID

和一段代码

      file = openFileDialog1.FileName;
      int byteLoc = 0;
      try
      {
           var bytes = File.ReadAllBytes(file);
           //loop through each byte from the input file
           foreach (var singleByte in bytes)
           {
                //Preamble - 4 bytes
                if (byteLoc < 4)
                {
                    preamble += Convert.ToString(singleByte);
                    preamble += " ";                        
                }
                //Message Type - 1 byte
                else if (byteLoc == 4)
                {
                    msgType += Convert.ToString(singleByte);
                }
                //Message Length - 3 bytes
                else if ((byteLoc > 4) || (byteLoc <= 7))
                {
                    msgLen += Convert.ToString(singleByte);
                    Console.WriteLine("Len:" + byteLoc);  //for debug
                }
                //Test ID - 4 bytes
                else if ((byteLoc >= 8) || (byteLoc <= 11))
                {
                    testID += Convert.ToString(singleByte);
                    Console.WriteLine("ID:" + byteLoc);   //for debug
                }
                byteLoc++;
           }
      }
file=openFileDialog1.FileName;
int byteLoc=0;
尝试
{
var bytes=File.ReadAllBytes(文件);
//循环遍历输入文件中的每个字节
foreach(以字节为单位的单字节变量)
{
//前导码-4字节
if(byteLoc<4)
{
前导+=转换为字符串(单字节);
序言+=”;
}
//消息类型-1字节
else if(byteLoc==4)
{
msgType+=Convert.ToString(单字节);
}
//消息长度-3字节

else if((byteLoc>4)| |(byteLoc=8)| |(byteLoc
else if((byteLoc>4)| |(byteLoc=8)|(byteLoc
else if((byteLoc>4)| |(byteLoc=8)|(byteLoc您的条件是
byteLoc>4或byteLoc 4和byteLoc您的条件是
byteLoc>4或byteLoc 4和byteLoc如果条件不正确:


else if((byteLoc>4)| |(byteLoc 4)和&(byteLoc如果if条件下的短路不正确:


else if((byteLoc>4)| |(byteLoc 4)&&(byteLoc)如前所述,问题是您使用的是
|
(OR)而不是
&&
(AND),但由于您使用的是
else if
,您知道前面的条件为假,因此只能使用上限检查

if (byteLoc < 4)
{
    preamble += Convert.ToString(singleByte);
    preamble += " ";                        
}
//Message Type - 1 byte
else if (byteLoc == 4)
{
    msgType += Convert.ToString(singleByte);
}
//Message Length - 3 bytes
else if (byteLoc <= 7)
{
    msgLen += Convert.ToString(singleByte);
    Console.WriteLine("Len:" + byteLoc);  //for debug
}
//Test ID - 4 bytes
else if (byteLoc <= 11)
{
    testID += Convert.ToString(singleByte);
    Console.WriteLine("ID:" + byteLoc);   //for debug
}
if(byteLoc<4)
{
前导+=转换为字符串(单字节);
序言+=”;
}
//消息类型-1字节
else if(byteLoc==4)
{
msgType+=Convert.ToString(单字节);
}
//消息长度-3字节

else if(byteLoc如前所述,问题是您使用的是
|
(OR)而不是
&&
(AND),但由于您正在执行
else if
您知道前面的条件为false,因此只能使用上限检查

if (byteLoc < 4)
{
    preamble += Convert.ToString(singleByte);
    preamble += " ";                        
}
//Message Type - 1 byte
else if (byteLoc == 4)
{
    msgType += Convert.ToString(singleByte);
}
//Message Length - 3 bytes
else if (byteLoc <= 7)
{
    msgLen += Convert.ToString(singleByte);
    Console.WriteLine("Len:" + byteLoc);  //for debug
}
//Test ID - 4 bytes
else if (byteLoc <= 11)
{
    testID += Convert.ToString(singleByte);
    Console.WriteLine("ID:" + byteLoc);   //for debug
}
if(byteLoc<4)
{
前导+=转换为字符串(单字节);
序言+=”;
}
//消息类型-1字节
else if(byteLoc==4)
{
msgType+=Convert.ToString(单字节);
}
//消息长度-3字节

else if(byteLoc我知道这不是你想要的,但可能迭代所有字节不是最好的解决方案。因为每种类型(前导码、消息类型、消息长度和testID)有固定的字节数。你可以这样做:

        FileStream fs = File.OpenRead(@"C:\YourFilePath");
        BinaryReader br = new BinaryReader(fs);
        string preamble = Encoding.Default.GetString(br.ReadBytes(4));
        string msgType = br.ReadByte().ToString();
        string msgLen = Encoding.Default.GetString(br.ReadBytes(3));
        string testID = Encoding.Default.GetString(br.ReadBytes(4));

我知道这不是您要求的,但可能迭代所有字节并不是最佳解决方案。因为每种类型(前导、消息类型、消息长度和testID)有固定的字节数。您可以执行以下操作:

        FileStream fs = File.OpenRead(@"C:\YourFilePath");
        BinaryReader br = new BinaryReader(fs);
        string preamble = Encoding.Default.GetString(br.ReadBytes(4));
        string msgType = br.ReadByte().ToString();
        string msgLen = Encoding.Default.GetString(br.ReadBytes(3));
        string testID = Encoding.Default.GetString(br.ReadBytes(4));

您应该使用
&
而不是
|
。所有值都大于4或小于7。提示:如果
byteLoc==47
bytLoc>4
的计算结果是什么?存在的每个整数要么大于4,要么小于或等于7。5、6和7都是。您应该使用
&
而不是
| |
。一切都大于4或小于7。提示:如果
byteLoc==47
,那么
bytLoc>4
的计算结果是什么?存在的每个整数要么大于4,要么小于或等于7。5、6和7都是。天哪,我是个白痴。当你盯着同一个代码看太久时,就会发生这种情况。谢谢。甜心,我是个白痴。这就是当你盯着同一个代码看太久时会发生的事情。谢谢。非常好的建议。谢谢!非常好的建议。谢谢!那更干净了。我可以试一试。谢谢!那更干净了。我可以试一试。谢谢!