【问题标题】:How To I Write Copymem Lib "Kernel32" Alias "Rtlmovememory" In Vb.Net如何在 Vb.Net 中编写 Copymem Lib“Kernel32”别名“Rtlmovememory”
【发布时间】:2015-04-03 18:47:05
【问题描述】:

下面是我的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

我参考了Equivalent of CopyMemory in .NET

但我仍然没有得到这个

请人帮忙!!!

【问题讨论】:

  • 抱歉,我看不到问题(说“它不起作用”不是问题)。
  • CopyMem(VarPtr(dataX) + 1, dataX, 3) ' 问题出在这里它只是进入无穷大或挂断没有错误什么
  • 请把它放在问题中。 PS。 Array.Copybyte 数组有什么问题?聚苯乙烯。您似乎正在尝试编写自己的密码学:“任何人都可以编写他们无法破解的算法;这并没有说明其他人是否可以破解它”。
  • 它基本上是内存复制,我不知道如何在 vb.net 中实现相同(它是河豚密码)

标签: vb.net visual-studio-2010 vb6 copymemory


【解决方案1】:

如果您想在 .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 返回的字节数组将是字符串长度的两倍,因此您将只使用字符串的一半。

【讨论】:

  • 一个小请求,我只是这些东西的初学者,你会解释你的代码实际做了什么,以及你所说的“旁注”。
  • @Dandy:代码复制整数中四个字节中的三个字节,从位置 1,2,3 到位置 0,1,2。位操作通过屏蔽保留在原位的单个字节并将其与移位八位(一个字节)的三个字节组合来执行相同的操作。关于编码,如果你有字符串"ABC"Encoding.Unicode.GetBytes方法不会返回数组{ 65, 66, 67 },它会返回数组{ 65, 0, 66, 0, 67, 0 },因为每个字符都被编码成两个字节。
  • Does BitConverter.GetBytes 与 Encoding.Unicode.GetBytes 做同样的事情我的意思是 BitConverter.GetBytes 是否也会返回字符串长度的两倍?
  • @Dandy:你不能在字符串上使用Bitconverter.GetBytes method。它用于将值类型转换为它们的字节表示形式。
  • Array.Copy(temp, 1, temp, 0, 3) 给出的结果与 CopyMem(VarPtr(dataX) + 1, dataX, 3) 不同
猜你喜欢
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多