2015-03-21 2 views
0

Я использую шифрование файлов, и я не могу заставить это работать. Я пытаюсь разбить файл на четные блоки байтов, если файл не делится на 555, и в этом случае я буду хранить оставшиеся байты в последнем индексе массива 2d. Таким образом, чтобы поместить его визуально байты должны выглядеть следующим образом:Шифрование пользовательского файла, странное исключение

  1. aaaaaaaaaaaaa
  2. aaaaaaaaaaaaa
  3. aaaaaaaaaaaaa
  4. ааа

отладчик говорит индекс находится вне диапазона на линии где я увеличиваю ii, но индекс не выходит за пределы допустимого диапазона ... Я бывал на этом некоторое время, и я думаю, что для этого мне нужен новый набор глаз. Любая помощь будет оценена по достоинству.

Функциональные блоки (ByVal данные в виде массива)

Dim out As New List(Of Byte) 
    Dim remainder As Integer = data.Length Mod 555 ' Also will be the last block size 
    Dim blockSize As Integer = (data.Length - remainder)/555 'The other blocks length 
    Dim hold(555, blockSize) As Byte 

    Dim i As Integer = 0 
    Dim ii As Integer = 0 

    Do Until i >= 555 
     Do Until ii >= blockSize 
      hold(i, ii) = data(ii) 
      ii += 1 
     Loop 
     blockSize += blockSize 
     i += 1 
    Loop 


    Return out.ToArray 
End Function 
+0

'BLOCKSIZE + = blockSize' удваивает размер. 555 раз. Это, вероятно, не то, что вы хотите. – Ryan

+0

Да ничего себе ... Это было глупо, я, очевидно, устал. Но даже если я полностью выберу эту линейку, это все равно дает мне такое исключение из-за того, что я вышел из-под контроля. Я думаю, что я просто не уверен, как правильно петлять, чтобы получить то, что я хочу. – iamwormlike

+0

Значит, размер блока 555 байтов, или вы хотите блоки 555/556? – Ryan

ответ

0

Там несколько проблем здесь:

  • blockSize += blockSize, которая удваивает blockSize каждый раз, 555 раз.

  • ii используется как общий счетчик (data(ii)) и в качестве каждого блока счетчика (hold(i, ii)), но она не может быть как сам по себе.

  • out не используется вообще.

  • data является нетипизированным Array. Если вы еще не используете Option Strict, вы должны включить его.

  • Использование data.Length \ 555 в качестве размера блока дает вам 555 блоков, когда длина делится равномерно, а 556 - если нет. Это не кажется желательно.

  • Копирование каждого блока неэффективно. Используйте, пожалуйста, ArraySegment(T).

  • Для удобства вы можете использовать функцию генератора.

Так, что-то вроде этого:

Iterator Function GetBlocks(data As Byte()) As IEnumerable(Of ArraySegment(Of Byte)) 
    Const BLOCK_COUNT As Integer = 555 

    Dim blockSize As Integer = CInt(Math.Ceil(data.Length/BLOCK_COUNT)) 
    Dim finalBlockOffset As Integer = (BLOCK_COUNT - 1) * blockSize 
    Dim finalBlockSize As Integer = data.Length - finalBlockOffset 

    For i = 0 To BLOCK_COUNT - 2 
     Yield New ArraySegment(data, i * blockSize, blockSize) 
    Next 

    Yield New ArraySegment(data, finalBlockOffset, finalBlockSize) 
End Function