Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: coco en Febrero 07, 2010, 03:30:13 pm
-
estaba forreando, intentando pasar un long a un array de bytes:
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:
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
-
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.
-
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
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
-
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
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
-
Esta resuelto asi que pongo la respuesta par algun otro que quiera saberlo.
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