Autor Tema: Maldito CopyMemory! [help]  (Leído 4669 veces)

0 Usuarios y 1 Visitante están viendo este tema.

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Maldito CopyMemory! [help]
« en: Febrero 07, 2010, 03:30:13 pm »
estaba forreando, intentando pasar un long a un array de bytes:

Código: [Seleccionar]
    Dim lngPtr As Long   
    Dim bvBytes(3) As Byte

    lngPtr = 65535
    Call CopyMemory(bvBytes(0), ByVal VarPtr(lngPtr), 4)

    Debug.Print bvBytes(0); "-"; bvBytes(1); "-"; bvBytes(2); "-"; bvBytes(3)

copy memory esta declarado como:
Código: [Seleccionar]
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
y el resultado es: " 255 - 255 - 0 - 0 "

Segun mis mediocres conocimientos, 1 byte con 255, indica 4 bits de 1s. Es decir, 255 y 255 serian 8 bits de 1s, o 2 bytes. Pero el Long ocupa unos misteriosos 4 bytes.

Ahora, si uso 65536, el resultado pasa a ser: " 0 - 0 - 0 - 0 "

que demonios pasa?

saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Maldito CopyMemory! [help]
« Respuesta #1 en: Febrero 07, 2010, 04:37:47 pm »
parece ser que no es lo que uno piensa. yo pense que si paso un long en su maximo de capacidad por ejemplo 2147483647  al array tendria que ser 255,255,255,255 pero no es asi es  255,255,255,127 porque  ??? ni idea.

para que sea 255,255,255,255 hay que pasarle -1

en el ejemplo que vos pusite esta bien osea lo copia bien ya que si depsues haces la inversa mantiene los valores exacto.

la verdad no te puedo ayudar  :-X  :-\ , pero bueno hay que confiar que esta bien ;D.


cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Maldito CopyMemory! [help]
« Respuesta #2 en: Febrero 07, 2010, 04:56:49 pm »
El problema es que la variable long tiene signo (puede ser negativa), y para hacer eso se utilizan los ultimos bytes del numero. Por lo general cuando trabajas con archivos y memoria donde los valores pueden ser muy grandes y podrias encontrarte con por ejemplo un archivo que tengo un size "negativo" lo que se hace es convertir la variable a "unsigned", que es eso? es basicamente quitar el signo (resolver el valor positivo real).

Ejemplo de http://support.microsoft.com/kb/189323

Código: [Seleccionar]
Private Sub Form_Load()
    Debug.Print LongToUnsigned(&HFFFFFFFF)
End Sub

Function LongToUnsigned(Value As Long) As Double
    If Value < 0 Then
        LongToUnsigned = Value + 4294967296#
    Else
        LongToUnsigned = Value
    End If
End Function

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Maldito CopyMemory! [help]
« Respuesta #3 en: Febrero 07, 2010, 05:32:19 pm »
El problema es que la variable long tiene signo (puede ser negativa), y para hacer eso se utilizan los ultimos bytes del numero. Por lo general cuando trabajas con archivos y memoria donde los valores pueden ser muy grandes y podrias encontrarte con por ejemplo un archivo que tengo un size "negativo" lo que se hace es convertir la variable a "unsigned", que es eso? es basicamente quitar el signo (resolver el valor positivo real).

Ejemplo de http://support.microsoft.com/kb/189323

Código: [Seleccionar]
Private Sub Form_Load()
    Debug.Print LongToUnsigned(&HFFFFFFFF)
End Sub

Function LongToUnsigned(Value As Long) As Double
    If Value < 0 Then
        LongToUnsigned = Value + 4294967296#
    Else
        LongToUnsigned = Value
    End If
End Function

todo piolo, pero no entendi porque pasa esto, es decir como convertir esos 4 bytes en el long de nuevo.

parece ser que no es lo que uno piensa. yo pense que si paso un long en su maximo de capacidad por ejemplo 2147483647  al array tendria que ser 255,255,255,255 pero no es asi es  255,255,255,127 porque  ??? ni idea.

para que sea 255,255,255,255 hay que pasarle -1

en el ejemplo que vos pusite esta bien osea lo copia bien ya que si depsues haces la inversa mantiene los valores exacto.

la verdad no te puedo ayudar  :-X  :-\ , pero bueno hay que confiar que esta bien ;D.



voy a hacer eso, total es para comparar 2 variables, y si son iguales, los bytes tiene q ser =

saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Maldito CopyMemory! [help]
« Respuesta #4 en: Febrero 07, 2010, 05:49:11 pm »
Esta resuelto asi que pongo la respuesta par algun otro que quiera saberlo.

Código: [Seleccionar]
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub Form_Load()
    Dim lngPtr As Long
    Dim bvBytes(3) As Byte

    lngPtr = 65535
    Call CopyMemory(bvBytes(0), ByVal VarPtr(lngPtr), 4)

    Debug.Print bvBytes(0); "-"; bvBytes(1); "-"; bvBytes(2); "-"; bvBytes(3)
    Debug.Print CLng("&h" & Hex(bvBytes(3)) & Hex(bvBytes(2)) & Hex(bvBytes(1)) & Hex(bvBytes(0)))
End Sub