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