我偶然发现了这个SO post,其中包含一个编码和解码摩尔斯电码的脚本。
它不是开箱即用的,但是我能够对其进行设置,以便编码可以使用,现在它对美国和大陆代码都适用。
然而,解码已被证明是一个更大的挑战。最初,它是打印出一堆Es和Is,因为不管有多少个点或连续多少行,它当然都会逐个字符地打印,而Es和Is都是这样。
因此,我知道我必须检查间距并一次只做一个字,而不是一个字一个字地
由于美国摩尔斯语中的某些字母(例如C(..。))在字母内带有空格的事实也使情况变得复杂。因此,字母之间不能有一个空格的分隔。实际上,有些字母内有2个空格,因此也不起作用。我最终在每个字母之间留出3个空格,在每个单词之间留出5个空格,这样我就可以对大陆使用相同的代码(如果我自己做大陆,那么我可以做1和3,而不是3和5)
function decode {
declare -A letter
if [ "$2" == "American" ]
then
letter[. .]="O";
letter[. ..]="R";
letter[...]="S";
fi
for (( i = 0; i < ${#1}; i=i + 1 ));
do
j=1
n=$i
s=0
while (( $s == 0 && $n + 3 <= ${#1} ));
do
((n++))
if [ "${1:n:3}" == " " ]
then
s=1
fi
((j++))
echo "$n"
done
echo "j is $j i is $i"
printf '%s' "${letter[${1:i:j}]}"
printf '%s' " "
sleep 0.1
done
}
decode "... . . ..."
为简洁起见,删除了大多数字符。 应该的最后一行返回SOS(即American Morse中的SOS)。
如何修改for循环和嵌套的while循环,以便它确定要在我的printf
语句中使用的一个字母中的所有字符,然后一直移到下一个字母记住字符串的大小吗?
到目前为止的输出如下:
American Morse: ... . . ...
1
2
3
j is 4 i is 0
2
3
j is 3 i is 1
3
j is 2 i is 2
4
5
6
7
8
9
j is 7 i is 3
5
6
7
8
9
j is 6 i is 4
6
7
8
9
j is 5 i is 5
7
8
9
j is 4 i is 6
8
9
j is 3 i is 7
9
j is 2 i is 8
10
11
12
13
j is 5 i is 9
11
12
13
j is 4 i is 10
12
13
j is 3 i is 11
13
j is 2 i is 12
I j is 1 i is 13
E j is 1 i is 14
E
Press ENTER to return: