Просто использовать словарь и перебор всех символов в строке и вам не придется беспокоиться о поиске символов и перевода их в правильном порядке. Используйте букву алфавита в качестве ключа и кода Морзе в качестве значения ... то вы можете просто пройти через текст и перевести каждую букву так:
Dim translate As New Dictionary(Of String, String) From {{" ", " "}, _
{"A", "*="}, _
{"B", "=***"}, _
{"C", "=*=*"}, _
{"D", "=**"}, _
{"E", "*"}, _
{"F", "**=*"}, _
{"G", "==*"}, _
{"H", "****"}, _
{"I", "**"}, _
{"J", "*==="}, _
{"K", "=*="}, _
{"L", "*=**"}, _
{"M", "=="}, _
{"N", "=*"}, _
{"O", "==="}, _
{"P", "*==*"}, _
{"Q", "==*="}, _
{"R", "*=*"}, _
{"S", "***"}, _
{"T", "="}, _
{"U", "**="}, _
{"V", "***="}, _
{"W", "*=="}, _
{"X", "=**="}, _
{"Y", "=*=="}, _
{"Z", "==**"}}
Dim translatedMsg As String = Nothing
For Each c As Char In txtCode.Text.ToUpper
translatedMsg += translate(c) & " "
Next
Debug.Print(translatedMsg.TrimEnd)
'Output for "Hello World": **** * *=** *=** === *== === *=* *=** =**
Edit: Ну, идя назад от значения к его ключу не так чисто, как переход от ключа к значению, потому что для него нет никакой нативной функции, но Linq отлично подходит для этого ... и, если честно, я не думал о пробелы, переводящие сначала. Я мог бы добавить специальный символ в словарь для пробелов, и это упростит перевод. Но, тем не менее, я буду придерживаться своего первого примера, например, и вот как вы переводите сообщение назад. Я снова использовал «Hello World», и чтобы обойти проблему с пробелами, я просто подменил подчеркивание для пространства, чтобы я мог правильно декодировать сообщение (также, очевидно, вы теряете разницу в верхнем/нижнем регистре, поскольку код Морзе не различает два):
Dim strMorseMsg As String = "**** * *=** *=** === *== === *=* *=** =**"
strMorseMsg = strMorseMsg.Replace(" ", " _ ") 'substitution here to distinguish spaces between words from the space between letters
Dim aryMorseMsg() As String = strMorseMsg.Split(CChar(" "))
Dim originalMessage As String = Nothing
For Each code As String In aryMorseMsg
If code.Equals("_") Then 'here's where the underscore helps branch our logic between adding a space and adding a letter
originalMessage += " "
Else
originalMessage += translate.FirstOrDefault(Function(x) x.Value = code).Key
End If
Next
MsgBox(originalMessage)
'Outputs "HELLO WORLD"
Nice решение, что это именно то, что словарь для. Обратите внимание, что вам понадобятся пробелы между буквами. В противном случае получатель не будет знать, означает ли '***' 'EEE',' EI', 'IE' или' S'. – Heinzi
О да, очень хороший момент! – soohoonigan
@Heinzi I второй это! Со словарем я могу легко сказать, что точка кода, и сразу же знать, как проверить перевод, если я чувствую необходимость. –