2015-01-07 5 views
0

В настоящее время я работаю над программой, которая преобразует строку в «комбинированное целое» (а именно: из строки она будет разделена на два символа за раз, а затем каждый символ в каждая группа будет преобразована в номер ASCII, а затем первый символ будет умножен на 256 (сдвиг 8 бит влево) и добавит второй символ. Он не должен исключать/забывать любой символ внутри строкиArray go out of bounds in VB

Здесь, когда Проблема действительно начать: он бросил IndexOutOfRangeException

Dim input As String = TextBox1.Text.PadLeft(1) 
    Dim charArr As Char() = input.ToCharArray 
    Dim intGroup As UShort 
    Dim strout As String = "" 

    For index = 0 To charArr.Length - 2 Step 2 
     Dim i = index 
     Dim a = charArr(i) 
     Dim b = charArr(i + 1) 

     intGroup = CByte(AscW(a)) * 256 + CByte(AscW(b)) 
     strout = strout + CStr(intGroup) + " " 
    Next 

    MsgBox(strout) 

Мое предположение было то, что я изменить index внутри WHI петли ch «запрещено».

Любое возможное решение?

Благодаря

+0

Почему, по вашему мнению, 'input.Length + 1' является правильной верхней границей для вашего цикла? –

+0

не уверен, я просто чувствую это так. – ChrisYukinon

+0

Подумайте об этом так: игнорируя «шаг 2» на мгновение - если у вас есть длина строки 2, вы просите цикл for получить доступ к * четырем * индексы (индексы 0, 1, 2 и 3). Это кажется вам правильным? Когда задействованы только два символа? –

ответ

1

Я хотел бы сделать что-то вроде этого, но я не знаю, как вы хотите иметь дело с нечетными строками длины:

For index = 0 To charArr.Length - 1 Step 2 
    Dim a = charArr(index) 
    Dim b = If(index=charArr.Length - 1, _ 
      <something to use for odd length strings>, _ 
      charArr(index + 1)) 

    intGroup = CByte(AscW(a)) * 256 + CByte(AscW(b)) 
    strout = strout + CStr(intGroup) + " " 
Next 

Я не знаю, что вы хотите использовать, особенно если вы носите в виду, что строки .NET (в отличие, скажем, строки C) вполне могут содержать символ с кодом ascii 0, поэтому просто использование 0 может оставить вас с неоднозначными данными, в зависимости от того, как вы , используя эту строку, реконструкция.

Но в основном, вам не нужно выполнять какую-либо специальную обработку для строк с нечетной длиной, и никакие магические манипуляции с параметрами петли for не позволят это сделать - вы либо имеете дело с ними в цикле (как указано выше), либо используйте короткий цикл (.Length - 2) и выполните проверку длины позже и обработайте конечный символ, который вы пропустили в цикле отдельно.

+0

Это близко, но мне удалось пойти своим путем: If (input.Length Mod 2 = 1) Then input = input + Chr (0) .ToString End If – ChrisYukinon

0
For index = 0 To input.Length - 2 step 2 

массив его с нуля, так что, если длина = п, последний элемент обр [п-1]. для элемента только для элементов управления, последний элемент - его arr [n-2].

+0

Я сделал это, но это не считалось бы последним символом, если бы это было сделано таким образом. – ChrisYukinon

+0

Возможно, ваш входной код mod 2 = 1. – dovid

+0

Нет радости, это не сработало как я сказал – ChrisYukinon