下面是我的vb6代码
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Property Let Key(New_Value As String)
Dim i As Long
Dim j As Long
Dim K As Long
Dim dataX As Long
Dim datal As Long
Dim datar As Long
Dim Key() As Byte
Dim KeyLength As Long
'Do nothing if the key is buffered
If (m_KeyValue = New_Value) Then Exit Property
m_KeyValue = New_Value
'Convert the new key into a bytearray
KeyLength = Len(New_Value)
Key() = StrConv(New_Value, vbFromUnicode)
'Create key-dependant p-boxes
j = 0
For i = 0 To (ROUNDS + 1)
dataX = 0
For K = 0 To 3
Call CopyMem(ByVal VarPtr(dataX) + 1, dataX, 3) 'the problem is here
dataX = (dataX Or Key(j))
j = j + 1
If (j >= KeyLength) Then j = 0
Next
m_pBox(i) = m_pBox(i) Xor dataX
Next
End Property
CopyMem sub lib我如何在vb.net中使用它
现在这里是我的vb.net代码相同的
Private Declare Sub CopyMem Lib "KERNEL32" Alias "RtlMoveMemory" (ByVal pDst As Object, ByVal pSrc As Object, ByVal ByteLen As Integer)
Public WriteOnly Property Key() As String
Set(ByVal Value As String)
Dim i As Long
Dim j As Long
Dim K As Long
Dim dataX As Long
Dim datal As Long
Dim datar As Long
Dim Key() As Byte
Dim KeyLength As Long
'Do nothing if the key is buffered
If (m_KeyValue = Value) Then Exit Property
m_KeyValue = Value
'Convert the new key into a bytearray
KeyLength = Len(Value)
Key = System.Text.Encoding.Unicode.GetBytes(Value)
'Create key-dependant p-boxes
j = 0
For i = 0 To (ROUNDS + 1)
dataX = 0
For K = 0 To 3
CopyMem(VarPtr(dataX) + 1, dataX, 3) ' the problem is here
dataX = (dataX Or Key(j))
j = j + 1
If (j >= KeyLength) Then j = 0
Next
m_pBox(i) = m_pBox(i) Xor dataX
Next
End Property
这是VarPtr
Public Function VarPtr(ByVal e As Object) As Object
Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
GC.Free()
Return GC2
End Function
我已提到Equivalent of CopyMemory in .NET
但我仍然没有得到这个
请有人帮忙!!!
答案 0 :(得分:3)
如果要使用.NET中的指针访问数据,则需要在整个操作期间将它们固定。 VarPtr
方法在获取对象的地址时固定对象,但随后它会取消对象。这意味着在进行CopyMem
调用时可以移动对象。大多数情况下,对象没有被移动,所以看起来效果很好,但是当它被移动时,CopyMem
操作可能会改变其他一些数据。这可能会使应用程序中的任何对象行为异常,或者使应用程序崩溃。
无论如何,使用内存复制对于在整数中移动几位来说肯定是过度的。 (顺便说一句,VB 6中的Long
数据类型对应于VB.NET中的Integer
数据类型。)
您可以将整数转换为字节数组,使用Array.Copy
方法,然后将其转换回来:
Dim temp As Byte() = BitConverter.GetBytes(dataX)
Array.Copy(temp, 0, temp, 1, 3)
dataX = BitConverter.ToInt32(temp, 0)
您也可以使用位操作:
dataX = (dataX And &HFF) Or (dataX << 8)
附注:Encoding.Unicode
用于UTF-16编码。这意味着GetBytes
返回的字节数组将是字符串长度的两倍,因此您只使用字符串的一半。