Ver Mensaje Individual
  #6 (permalink)  
Antiguo 19/11/2005, 02:59
Avatar de Beakdan
Beakdan
 
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
No entendí muy bien eso de "una colección que esté como valor hexadecimal". Si tu cifra está como un string con la representación hexadecimal del número, probablemente sea más fácil usar una de las funciones para strings como mid$, left$ o rigth$ para obtener los caracteres que interesan.
Pero, en el caso de variables numéricas, la operación inversa es algo usual sobretodo si trabajas con la API y subclassing. Pero en esos casos, interesa separar el word más significativo del menos significativo en un DWORD. Sin embargo, la mecánica es la misma. De hecho, es posible realizarla con operaciones básicas de VB, sólo que como los tipos de datos númericos mayores que un byte son valores con signo, se debe tener cuidado. Todo se simplificaría si VB contara con una operación de desplazamiento de bits.

Código:
Option Explicit

Private Declare Sub RtlMoveMemory Lib "kernel32" ( _
    ByRef Destination As Any, _
    ByRef Source As Any, _
    ByVal Length As Long)
   
Private Type DWORD_BYTE
    BYTES(3) As Byte
End Type

Private Type DWORD_LONG
    DWORD As Long
End Type

Private Sub Form_Load()
Dim tmpLng As Long
Dim tmpBytArr(3) As Byte
Dim tmpByt As Byte
Dim tmpDWrdLng As DWORD_LONG
Dim tmpDWrdByt As DWORD_BYTE
    
    'Con tipos de datos, indicas
    'el índice del byte que quieres
    tmpDWrdLng.DWORD = &HABDCEF00
    LSet tmpDWrdByt = tmpDWrdLng
    Debug.Print "Con Types: "
    Debug.Print "Byte 0:" & tmpDWrdByt.BYTES(0)
    Debug.Print "Byte 1:" & tmpDWrdByt.BYTES(1)
    Debug.Print "Byte 2:" & tmpDWrdByt.BYTES(2)
    Debug.Print "Byte 3:" & tmpDWrdByt.BYTES(3)
    
    'Con la API
    Debug.Print "Con la API: "
    tmpLng = &HABDCEF00
    RtlMoveMemory tmpBytArr(0), tmpLng, 4&
    
    Debug.Print "Byte 0: " & tmpBytArr(0)
    Debug.Print "Byte 1: " & tmpBytArr(1)
    Debug.Print "Byte 2: " & tmpBytArr(2)
    Debug.Print "Byte 3: " & tmpBytArr(3)
    
    'Con métodos comunes de VB se usa una combinación
    'de máscaras de bits con divisiones
    Debug.Print "Con Métodos de VB: "
    'LSB
    tmpByt = tmpLng And &HFF&
    Debug.Print "Byte 0: " & tmpByt
    
    'Byte 1
    tmpByt = (tmpLng And &HFF00&) \ &H100
    Debug.Print "Byte 1: " & tmpByt
    
    'Byte 2
    tmpByt = (tmpLng And &HFF0000) \ &H10000
    Debug.Print "Byte 2: " & tmpByt

    'MSB: tendrás problemas para obtenerlo si
    'el número que "separas" es negativo. Por lo
    'tanto, se requiere un paso extra de enmascaramiento
    tmpByt = ((tmpLng And &HFF000000) \ &H1000000) And &HFF&
    Debug.Print "Byte 3: " & tmpByt

End Sub
Por cierto, no te había comentado sobre un error en el código que habías puesto, ya que el usuario que comenzó este thread no respondió nada y consideré muerta la discusión. Imagina que tienes dos bytes, cada uno con un valor de 15. Al utilizar tu código, se obtendría el valor de la cadena &HFF, que no es lo correcto ya que debería ser el valor de &H0F0F. En el caso de concatenar sólo dos bytes, usando tu código, habría que corregir cómo se obtiene la cadena del byte menos significativo:
Código:
WORD = Val("&H" & Hex$(Byte2) & Right$("0" & Hex$(Byte1), 2))

Última edición por Beakdan; 19/11/2005 a las 15:25