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 サブ 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

私は .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返されるバイト配列は文字列の長さの 2 倍になるため、文字列の半分だけを使用することになります。

于 2015-02-04T10:15:29.113 に答える