0

下面是我的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 子库我如何在 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

在 .NET 中提到了 CopyMemory 的等效项

但我仍然没有得到这个

请有人帮忙!!!

4

1 回答 1

4

如果您想在 .NET 中使用指针访问数据,那么您需要在整个操作过程中将它们固定。该VarPtr方法在获取对象的地址时固定对象,但随后取消固定对象。这意味着可以在您进行CopyMem呼叫时移动对象。大多数情况下,对象不会移动,因此它似乎可以正常工作,但是当它移动时,CopyMem操作可能会更改其他一些数据。这可能会使应用程序中的任何对象行为异常,或使应用程序崩溃。

无论如何,对于移动整数中的几位,使用内存复制绝对是矫枉过正。(顺便说一下Long,VB 6 中的Integer数据类型对应于 VB.NET 中的数据类型。)

您可以将整数转换为字节数组,使用该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返回的字节数组将是字符串长度的两倍,因此您将只使用字符串的一半。

于 2015-02-04T10:15:29.113 回答