退出do时将vb6迁移到vb.net do

退出do时将vb6迁移到vb.net do,vb.net,vb6,vb6-migration,Vb.net,Vb6,Vb6 Migration,我想将代码从vb6迁移到vb.net。 该项目是非常基本的(不使用dll或组件参考)只是模块 在压缩功能中,已成功实现。我很高兴。但解压时分不成功。这个节目被挂了。我试着把它修好,我发现问题出在做。。退出do..loop语句 注意:代码在vb6中成功运行 这是我的解压代码 Public Sub Decompress(ByteArray() As Byte) Dim InpPos As Long Dim InBitPos As Integer Dim LowValue As Long Dim Hi

我想将代码从vb6迁移到vb.net。 该项目是非常基本的(不使用dll或组件参考)只是模块

在压缩功能中,已成功实现。我很高兴。但解压时分不成功。这个节目被挂了。我试着把它修好,我发现问题出在做。。退出do..loop语句

注意:代码在vb6中成功运行

这是我的解压代码

Public Sub Decompress(ByteArray() As Byte)
Dim InpPos As Long
Dim InBitPos As Integer
Dim LowValue As Long
Dim HighValue As Long
Dim RangValue As Long
Dim MidValue As Long
Dim Value As Long
Dim mChar As Byte
Dim i As Integer
Dim Index As Integer
Dim EOF_State As Boolean
Dim TopBit As Long
Dim One(256) As Long
Dim Zero(256) As Long
Call Initiate
LowValue = 0
HighValue = (2 ^ MaxBits) - 1
TopBit = 2 ^ (MaxBits - 1)
InpPos = 0
Value = ReadBitsFromArray(ByteArray, InpPos, InBitPos, MaxBits)
Index = -1
For i = 0 To 256
    One(i) = 1
    Zero(i) = 1
Next
Do
    mChar = 0
    For i = 0 To 7
        Index = (1 * (2 ^ i)) - 1 + mChar
        RangValue = HighValue - LowValue
        MidValue = LowValue + (RangValue * (Zero(Index) / (One(Index) + Zero(Index))))
        If MidValue = LowValue Then MidValue = MidValue + 1
        If MidValue = HighValue - 1 Then MidValue = MidValue - 1
        If Value >= MidValue Then
            mChar = (2 * mChar) + 1
            LowValue = MidValue
            One(Index) = One(Index) + 1
        Else
            mChar = 2 * mChar
            HighValue = MidValue
            Zero(Index) = Zero(Index) + 1
        End If

        Do While (HighValue And TopBit) = (LowValue And TopBit) Or LowValue > HighValue - 255
            If InpPos <= UBound(ByteArray) Then
                Value = (Value And (TopBit - 1)) * 2 + ReadBitsFromArray(ByteArray, InpPos, InBitPos, 1)
                HighValue = (HighValue And (TopBit - 1)) * 2 + 1
                LowValue = (LowValue And (TopBit - 1)) * 2
                If LowValue >= HighValue Then HighValue = (2 ^ MaxBits) - 1
            Else
                EOF_State = True
                Exit Do
            End If
        Loop
        If EOF_State = True Then Exit Do
    Next
    Call AddmCharToArray(OutStream, OutPos, mChar)
Loop
ReDim Preserve OutStream(OutPos - 1)
End Sub

Private Sub Initiate()
ReDim OutStream(500)
OutPos = 0
OutBitCount = 0
OutByteBuf = 0
End Sub

Private Sub AddBitsToOutStream(Number As Integer)
OutByteBuf = OutByteBuf * 2 + Number
OutBitCount = OutBitCount + 1
If OutBitCount = 8 Then
    OutStream(OutPos) = OutByteBuf
    OutBitCount = 0
    OutByteBuf = 0
    OutPos = OutPos + 1
    If OutPos > UBound(OutStream) Then
        ReDim Preserve OutStream(OutPos + 500)
    End If
End If
End Sub

Private Function ReadBitsFromArray(FromArray() As Byte, FromPos As Long, FromBit As Integer, NumBits As Integer) As Long
Dim i As Integer
Dim Temp As Long
For i = 1 To NumBits
    Temp = Temp * 2 + (-1 * ((FromArray(FromPos) And 2 ^ (7 - FromBit)) > 0))
    FromBit = FromBit + 1
    If FromBit = 8 Then
        If FromPos + 1 > UBound(FromArray) Then
            Do While i < NumBits
                Temp = Temp * 2
                i = i + 1
            Loop
            FromPos = FromPos + 1
            Exit For
        End If
        FromPos = FromPos + 1
    FromBit = 0
    End If
Next
ReadBitsFromArray = Temp
End Function

Private Sub AddmCharToArray(ToArray() As Byte, ToPos As Long, mChar As Byte)
If ToPos > UBound(ToArray) Then ReDim Preserve ToArray(ToPos + 500)
ToArray(ToPos) = mChar
ToPos = ToPos + 1
End Sub
Public子解压缩(ByteArray()作为字节)
将InpPos变暗为长
Dim InBitPos为整数
变暗低值为长
低值高值长
暗淡的rang值等于长
模糊中值等于长
模糊值等于长
作为字节的Dim mChar
作为整数的Dim i
将索引设置为整数
Dim EOF_状态为布尔值
暗淡的上衣和长的一样
暗一(256)倍长
变暗零(256)倍长
呼叫发起人
低值=0
高值=(2^最大位)-1
TopBit=2^(最大位-1)
InpPos=0
Value=ReadBitsFromArray(ByteArray、InpPos、InBitPos、MaxBits)
索引=-1
对于i=0到256
一(i)=1
零(i)=1
下一个
做
mChar=0
对于i=0到7
索引=(1*(2^i))-1+mChar
RangValue=高值-低值
中值=低值+(RangValue*(零(指数)/(一(指数)+零(指数)))
如果中值=低值,则中值=中值+1
如果中值=高值-1,则中值=中值-1
如果值>=中值,则
mChar=(2*mChar)+1
低值=中值
一(索引)=一(索引)+1
其他的
mChar=2*mChar
高值=中值
零(指数)=零(指数)+1
如果结束
执行While(高值和顶位)=(低值和顶位)或低值>高值-255
如果InpPos=HighValue,则HighValue=(2^MaxBits)-1
其他的
EOF_状态=真
退出Do
如果结束
环
如果EOF_State=True,则退出Do
下一个
呼叫AddmCharToArray(外流、外流、mChar)
环
ReDim保留外流(外流-1)
端接头
专用子启动器()
雷迪姆外流(500)
输出=0
OutBitCount=0
OutByteBuf=0
端接头
私有子AddBitsOutStream(数字为整数)
OutByteBuf=OutByteBuf*2+数字
OutBitCount=OutBitCount+1
如果OutBitCount=8,则
外流(OutPos)=外流
OutBitCount=0
OutByteBuf=0
输出=输出+1
如果OutPos>UBound(流出),则
ReDim保留外流(外流+500)
如果结束
如果结束
端接头
私有函数ReadBitsFromArray(FromArray()为字节,FromPos为长,FromBit为整数,NumBits为整数)为长
作为整数的Dim i
变暗温度,如长
对于i=1,使其麻木
Temp=Temp*2+(-1*((FromArray(FromPos)和2^(7-FromBit))>0))
FromBit=FromBit+1
如果FromBit=8,则
如果FromPos+1>UBound(FromArray),则
趁我还活着的时候做
温度=温度*2
i=i+1
环
FromPos=FromPos+1
退出
如果结束
FromPos=FromPos+1
FromBit=0
如果结束
下一个
ReadBitsFromArray=温度
端函数
私有子AddmCharToArray(ToArray()作为字节,ToPos作为长,mChar作为字节)
如果地形>UBound(ToArray),则重新定义保留ToArray(地形+500)
ToArray(地形)=mChar
地形=地形+1
端接头
退出

Do
    mChar = 0
    For i = 0 To 7
        Index = (1 * (2 ^ i)) - 1 + mChar
        RangValue = HighValue - LowValue
        MidValue = LowValue + (RangValue * (Zero(Index) / (One(Index) + Zero(Index))))
        If MidValue = LowValue Then MidValue = MidValue + 1
        If MidValue = HighValue - 1 Then MidValue = MidValue - 1
        If Value >= MidValue Then
            mChar = (2 * mChar) + 1
            LowValue = MidValue
            One(Index) = One(Index) + 1
        Else
            mChar = 2 * mChar
            HighValue = MidValue
            Zero(Index) = Zero(Index) + 1
        End If

        Do While (HighValue And TopBit) = (LowValue And TopBit) Or LowValue > HighValue - 255
            If InpPos <= UBound(ByteArray) Then
                Value = (Value And (TopBit - 1)) * 2 + ReadBitsFromArray(ByteArray, InpPos, InBitPos, 1)
                HighValue = (HighValue And (TopBit - 1)) * 2 + 1
                LowValue = (LowValue And (TopBit - 1)) * 2
                If LowValue >= HighValue Then HighValue = (2 ^ MaxBits) - 1
            Else
                EOF_State = True
                Exit Do
            End If
        Loop
        If EOF_State = True Then Exit Do
    Next
    Call AddmCharToArray(OutStream, OutPos, mChar)
Loop
Do
mChar=0
对于i=0到7
索引=(1*(2^i))-1+mChar
RangValue=高值-低值
中值=低值+(RangValue*(零(指数)/(一(指数)+零(指数)))
如果中值=低值,则中值=中值+1
如果中值=高值-1,则中值=中值-1
如果值>=中值,则
mChar=(2*mChar)+1
低值=中值
一(索引)=一(索引)+1
其他的
mChar=2*mChar
高值=中值
零(指数)=零(指数)+1
如果结束
执行While(高值和顶位)=(低值和顶位)或低值>高值-255
如果InpPos=HighValue,则HighValue=(2^MaxBits)-1
其他的
EOF_状态=真
退出Do
如果结束
环
如果EOF_State=True,则退出Do
下一个
呼叫AddmCharToArray(外流、外流、mChar)
环
对不起,我英语写得不好

  Private Function ReadBitsFromArray(FromArray() As Byte, FromPos As Long, ...)
错误位于此函数声明中。只有当
InpPos
的增量超过数组的上限,并将
EOF_State
变量设置为True时,循环才能退出。循环本身根本不增加InpPos。在VB6中,它通过ReadBitsFromArray()函数,
FromBit=FromBit+1
语句递增。但是VB.NET中不再是这样

VB.NET中的一个重要变化是参数的传递方式。旧的Visual Basic版本默认为
ByRef
。一个有点奇怪的选择,它的理由在时间的迷雾中消失了。传递参数是一种非常昂贵的方法,传递ByRef需要传递一个指向值的指针,而不是值本身。每次访问变量都需要一个指针解引用。它至少比现代机器上通过值传递慢3倍,.NET经过了大量优化,可以通过CPU寄存器而不是堆栈传递参数值,如果参数是通过引用传递的,则无法工作

因此,VB.NET将
ByVal
设为默认值。由于您没有显式声明它,因此默认值将应用,并通过值传递
InpPos
。从不递增,这在调试器中很容易看到。修正:

Private Function ReadBitsFromArray(ByVal FromArray() As Byte, _
                                   ByRef FromPos As Integer, _
                                   ByVal FromBit As Integer, _
                                   ByVal NumBits As Integer) As Integer
请注意,在Long和Integer之间进行选择是您不得不担心的另一件事。VB6 Long是一个VB.NET整数。我猜整数在这里是合适的。请将.NETGZIPStand类视为备选方案,它听起来好像还不足以记住它仍然能保持这个代码的工作方式。

虫子i