0

这个字符串比较脚本有问题:

set result [string range "0002150C0E67" 8 11 ];
if {[expr {$result != "FFFF"  && $result != "0000"}]} {set result "OK byte 5&6 = 0x$result" } {set result "Fail Byte 5&6 = 0x$result" };

如果我将“0002150C0E67”更改为“0002150C0D67”或“0002150C0F67”(以及许多其他组合,我会得到一个好的结果。

怎么了?

4

1 回答 1

2

如果我们查看您的代码:

set result [string range "0002150C0E67" 8 11 ]

此时,result设置为字符串0E67。这是一个看起来像浮点数的字符串,其计算结果为 0×10 67,即为零。

现在,简化您的条件(额外expr没有添加任何内容)并重新格式化以遵循传统样式(以功能等效的方式),我们得到:

if {$result != "FFFF" && $result != "0000"} {
    set result "OK byte 5&6 = 0x$result" 
} else {
    set result "Fail Byte 5&6 = 0x$result" 
}

正如我们所看到的,第二个不等于比较不满足,因此选择了“失败”路径。更好的是像这样解析字符串:

scan "0002150C0E67" "%8x%4x" -> result

然后我们对结果进行数值比较并format产生输出:

if {$result != 0xFFFF && $result != 0} {
    set result [format "OK byte 5&6 = 0x%04x" $result]
} else {
    set result [format "Fail Byte 5&6 = 0x%04x" $result]
}
于 2020-06-23T14:11:19.057 回答