strings binarios ¿como?

Iniciado por SERBice, 28 Noviembre 2007, 00:13 AM

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

SERBice

si tengo el numero 1562036412 y lo quiero enviar por winsock, pero que no me ocupe los 10 digitos como si fuera un string y queiro mandarlo como si fuera binario, es decir un long en un string de modo que me envie 4 bytes (lo que seria algo como "¼È]" ó chr$(188) & chr$(200) & chr$(26) & chr$(93) segun mis calculos) ¿¿¿ como puedo hacerlo???

de momento lo hago usando arcivos binarios, escribo un archvo (una variable long en un archivo), la leo como string y la mando (y asi me ocupa solo 4 bytes) y en el otro lado del winsock hago la inversa, pero presumo qe  a gran escala puede traer una baja en el rendimiento ademas deno ser e metodo correcto. asi pues, queda planteada la inquietud, espero que alguen sepa la respuesta.


cobein

Código (vb) [Seleccionar]
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Sub Form_Load()
    Dim b(3) As Byte
    Dim lNum As Long
   
    lNum = 1562036412
    CopyMemory b(0), lNum, &H4
   
    Dim i As Long
   
    For i = 0 To 3: Debug.Print b(i);: Next
   
End Sub
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

SERBice

muchas gracias por responder....

sere curioso ¿y para hacer el proceso opuesto?, es decir, para pasar del string formado por los valores byte a long (de ¼È] a 1562036412 por ejemplo.).

nuevamente muchas gracias.

cobein

Código (vb) [Seleccionar]
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Sub Form_Load()
    Dim b(3) As Byte
    Dim lNum As Long

    lNum = 1562036412
    CopyMemory b(0), lNum, &H4

    Dim i As Long

    For i = 0 To 3: Debug.Print b(i);: Next

    lNum = 0
    CopyMemory lNum, b(0), &H4

    Debug.Print lNum

End Sub
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

SERBice

nuevamente gracias, he hecho estas dos funciones muy basicas (y sin cntrol de errores, luego se lo hare dado que si los parametros que se le pasan, en especial a FromBinary son nulos o strings vacios daran error).

Código (vb) [Seleccionar]
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Function ToBinary(lnum As Long) As String
    Dim b(3) As Byte
    Dim i As Long
    Dim strmsg As String
   
    CopyMemory b(0), lnum, &H4
   
    For i = 0 To 3
        strmsg = strmsg & Chr$(b(i))
    Next
    ToBinary = strmsg
End Function
Function FromBinary(strmsg As String) As Long
    Dim c() As Byte
    Dim lnum As Long
    Dim i As Long
   
    For i = 1 To Len(strmsg)
        ReDim Preserve c(i - 1)
        c(i - 1) = Asc(Mid$(strmsg, i, 1))
    Next
   
    CopyMemory lnum, c(0), Val("&H" & UBound(c) + 1)
   
   
    FromBinary = lnum
End Function
Private Sub Form_Load()
MsgBox ToBinary(96412234)
MsgBox FromBinary(ToBinary(96412234))
   
End Sub


edit: quisiera escuchar sugerencias y opiniones.

cobein

Código (vb) [Seleccionar]
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Function ToBinary(lnum As Long) As String
    Dim b(3) As Byte
   
    CopyMemory b(0), lnum, &H4
    ToBinary = StrConv(b, vbUnicode)
End Function

Function FromBinary(strmsg As String) As Long
    Dim b() As Byte
   
    b = StrConv(strmsg, vbFromUnicode)
    CopyMemory FromBinary, b(0), &H4
End Function

Private Sub Form_Load()

    Debug.Print FromBinary(ToBinary(96412234))

End Sub
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.