如果情况没有按照预期进行评估

本文关键字:评估 情况 如果 | 更新日期: 2023-09-27 18:09:47

我是Visual Studio和c#的新手,但我的问题似乎几乎是基本的,但我不能弄清楚它。我有一个二进制文件,我正在读入,我试图处理它,每次或多或少一个字节。问题是,当我在我的'if'条件中得到几个字节时,似乎在它应该是FALSE之后很久才评估为TRUE。

下面是输入二进制的快速列表,因此下面的代码是有意义的。

bytes[0-3]: preamble
Bytes[4]:消息类型
Bytes[5-7]:消息长度
bytes[8-11]: test 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++;
           }
      }

我已经打印出了序言和msgType,它们看起来像预期的那样。然而,问题是,当我到达msgLen(应该是字节5-7)的"if"条件时,它总是计算为TRUE。我看到消息"Len: byteLoc"从5开始,一直到文件的末尾。我在这里做错了什么,当byteLoc得到8,它不去下一个'if'条件?

如果情况没有按照预期进行评估

如前所述,问题是您正在使用|| (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
}
else if ((byteLoc > 4) || (byteLoc <= 7))
...
else if ((byteLoc >= 8) || (byteLoc <= 11))

这些应该是&&在一起而不是||

上面的第一个条件将总是求值为true(在前面的条件失败之后),因为byteLoc将大于4。你需要用AND来约束它,而不是OR

条件(true OR false)总是求值为true

您的条件是byteLoc > 4 OR byteLoc <= 7,它将始终为真。例如,11是一个大于4的数字,因此导致前半部分返回true,而3是一个小于或等于7的数字,因此将导致后半部分返回true。由于您使用的是OR,因此只有一个条件为真才能使整个条件返回真。

您希望使用&&而不是||,因为您希望您的条件为byteLoc > 4 AND byteLoc <= 7。这将确保只有当两个条件都为真时,整个条件才为真。

我知道这不是你想要的,但可能遍历所有字节并不是最好的解决方案。因为每个类型(前文、消息类型、消息长度和testd)的字节数是固定的。你可以这样做:

        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));

if条件下短路不正确:

else if (byteLoc> 4) | | (byteLoc & lt; = 7)) 对于大于4的任何值都将返回true

代替:

else if ((byteLoc > 4) && (byteLoc <= 7))