退出do时将vb6迁移到vb.net do
我想将代码从vb6迁移到vb.net。 该项目是非常基本的(不使用dll或组件参考)只是模块 在压缩功能中,已成功实现。我很高兴。但解压时分不成功。这个节目被挂了。我试着把它修好,我发现问题出在做。。退出do..loop语句 注意:代码在vb6中成功运行 这是我的解压代码退出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
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