如果情况没有按照预期进行评估
本文关键字:评估 情况 如果 | 更新日期: 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))
等