自定义文件加密,奇怪的例外

时间:2015-03-21 17:58:24

标签: .net vb.net encryption

我正在搞乱文件加密,我似乎无法让它工作。我试图将文件拆分成偶数字节块,除非该文件不能被555整除,在这种情况下,我将剩余的字节存储在2d数组的最后一个索引中。所以直观地说,字节应该是这样的:

  1. aaaaaaaaaaaaa
  2. aaaaaaaaaaaaa
  3. aaaaaaaaaaaaa
  4. AAA
  5. 调试器说索引超出了我增加ii的行的范围,但是索引没有超出范围......我已经有一段时间了,我想我需要一套新的眼睛为了这。任何帮助将不胜感激。

    功能块(ByVal data As Array)

        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
    

1 个答案:

答案 0 :(得分:0)

这里有一些问题:

  • blockSize += blockSize,每次加倍blockSize次,555次。

  • ii用作整体计数器(data(ii))和每个块计数器(hold(i, ii)),但它本身不能同时使用。< / p>

  • 完全不使用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