Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - BlackZeroX

#621
Cita de: Khronos14 en  5 Enero 2012, 00:17 AM

Se me ocurrió una forma de superar el algoritmo de BlackZeroX, igual mañana la pongo en práctica. Sería recorrer el bucle hasta la mitad e ir comprobando los números por delante y por detrás de la cadena, el problema sería juntar los números de las dos mitades pero en cadenas muy muy largas sería más eficiente.

Saludos.

Al leerte se me ocurrieron 2 formas mas... al rato las pongo en practica xP, igual son lentas en cadenas cortas, pero en cadenas largas uff.

Nota: Modifique mi codigo...

Dulces Lunas!¡.
#622

Una reducción de mMemoryEx...

Código (vb) [Seleccionar]


Private Function getNumbers2(ByRef sIn As String, ByRef sOut As String) As Long
Dim thisWord(0) As Integer  '   //  Un caracter = 2 bytes = integer
Dim dwOffSetGet As Long     '   //  Offset Get caracter...
Dim dwOffSetSet As Long     '   //  Offset Set caracter...
Dim wWord       As Integer  '   //  Letra en asc...
Dim dwRet       As Integer  '   //  Cantidad de digitos encontrados...
Dim dwLenI      As Long     '   //  Longitud en bytes de sIn...
Dim dwLenB      As Long     '   //  Longitud en bytes de sOut...
Dim dwOffset    As Long     '   //  Offset del Buffer...

    dwOffSetGet = (StrPtr(sIn) - VarPtr(thisWord(0))) \ 2
    dwLenB = LenB(sOut)

    If (dwLenB) Then
        dwOffSetSet = (StrPtr(sOut) - VarPtr(thisWord(0))) \ 2
    End If
    dwLenI = LenB(sIn)

    If (dwLenI) Then
        Do
            If (dwLenI And &H80000000) Then Exit Do

            wWord = thisWord(dwOffSetGet)

            If (wWord >= &H30) Then
                If (wWord <= &H39) Then
                    dwRet = (dwRet + 1)
                    If (dwLenB) Then
                        thisWord(dwOffSetSet) = wWord
                        dwOffSetSet = (dwOffSetSet + 1)
                        dwLenB = (dwLenB - 2)
                    End If
                End If
            End If

            dwOffSetGet = (dwOffSetGet + 1)
            dwLenI = (dwLenI - 2)

        Loop While (wWord > 0)
    End If

    thisWord(dwOffSetSet) = &H0&
    getNumbers2 = dwRet

End Function



o tambien asi:

Código (vb) [Seleccionar]


Option Explicit

Private Sub Form_Load()
Dim szCadena As String
Dim szBuffer As String
Dim lnBuffer As Long

    szCadena = "sdh!w2 28 :-)  9ndk#1@b______dy0--hveybd@  # qism083  s'kl...: su2b7h ++bjsnbvxj77ygv1hiiiioms90nms sjbah b#!1!  --R-E-D--0+-w++ONE***WWW."
    lnBuffer = getNumbers(szCadena, vbNullString)
    szBuffer = Space(lnBuffer)
    MsgBox "Se Obtubieron " & getNumbers(szCadena, szBuffer) & " de " & lnBuffer & vbCrLf & szBuffer
End Sub

Private Function getNumbers(ByRef szIn As String, ByRef szBuffer As String) As Long
Dim lnBuff      As Long
Dim lnIn        As Long
Dim iRet        As Long
Dim lPosIn      As Long
Dim lPosBuff    As Long
Dim word        As Integer

    lnBuff = LenB(szBuffer)
    lnIn = LenB(szIn)

    If (Len(szIn) = 0) Then
        getNumbers = iRet
        Exit Function
    End If

    lPosIn = &H1
    lPosBuff = &H1

    Do
        If (lnIn <= lPosIn) Then Exit Do
        word = Asc(MidB(szIn, lPosIn, 2))

        If (word >= 48 And 57 >= word) Then
            iRet = (iRet + 1)
            If (lnBuff) Then
                MidB(szBuffer, lPosBuff, 2) = Chr(word)
                lnBuff = (lnBuff - 2)
            End If
            lPosBuff = (lPosBuff + 2)
        End If

        lPosIn = (lPosIn + 2)

    Loop While (word > 0)

    getNumbers = iRet

End Function



Dulces Lunas!¡.
#623
Código (vb) [Seleccionar]


Private Sub Form_Load()
Dim szCadena As String
Dim szBuffer As String

   szBuffer = Space(20)
   szCadena = "ewiuc3dskhd8nkd62ndsnk9"
   
   mMemoryEx.initialize
   MsgBox getNumbers(szCadena, szBuffer)
   MsgBox szBuffer

End Sub

Private Function getNumbers(ByRef szIn As String, ByRef szBuffer As String)
Dim lnBuff  As Long
Dim iRet    As Long
Dim lpIn    As Long
Dim lpBuff  As Long
Dim word    As Integer

   lnBuff = Len(szBuffer)
   
   If (Len(szIn) = 0) Then
       getNumbers = iRet
       Exit Function
   End If
   
   lpIn = StrPtr(szIn)
   lpBuff = StrPtr(szBuffer)
   
   Do
       If (lnBuff = 0) Then Exit Do
       word = mMemoryEx.getWord(lpIn)
       
       If (word >= 48 And 57 >= word) Then
           iRet = (iRet + 1)
           'Mid$(szBuffer, iRet, 1) = Chr(word)
           mMemoryEx.putWord lpBuff, word
           lnBuff = (lnBuff - 1)
           lpBuff = (lpBuff + 2)
       End If
       
       lpIn = (lpIn + 2)
       
   Loop While (word > 0)
   
   getNumbers = iRet
   
End Function



mMemoryEx.bas



Option Explicit

Public Const PAGE_EXECUTE_READWRITE As Long = &H40
Public Const PAGE_EXECUTE_WRITECOPY As Long = &H80
Public Const PAGE_EXECUTE_READ As Long = &H20
Public Const PAGE_EXECUTE As Long = &H10
Public Const PAGE_READONLY As Long = 2
Public Const PAGE_WRITECOPY As Long = &H8
Public Const PAGE_NOACCESS As Long = 1
Public Const PAGE_READWRITE As Long = &H4

Declare Function VarPtrArr Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Declare Function IsBadWritePtr Lib "kernel32" (ByVal lp As Long, ByVal ucb As Long) As Long
Declare Function IsBadReadPtr Lib "kernel32" (ByVal lp As Long, ByVal ucb As Long) As Long
Declare Function VirtualProtect Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flNewProtect As Long, ByVal lpflOldProtect As Long) As Long

Private bvHack(0)               As Byte
Private lHackDelta              As Long
Private bInitialized            As Boolean

Public Function initialize() As Boolean ' By KarCrack
   On Error GoTo Error_Handle

   bvHack(-1) = bvHack(-1) 'Error check
   lHackDelta = VarPtr(bvHack(0))

   initialize = True
   bInitialized = initialize
   Exit Function
Error_Handle:
   If Err.Number = 9 Then Debug.Print "Remember to tick 'Remove array boundary check' and compile before using"
'    End
End Function

Public Function getByte(ByVal lptr As Long) As Byte ' By KarCrack
   If bInitialized Then getByte = bvHack(lptr - lHackDelta)
End Function

Public Function getWord(ByVal lptr As Long) As Integer ' By KarCrack
   If bInitialized Then getWord = makeWord(getByte(lptr + &H0), getByte(lptr + &H1))
End Function

Public Function getDWord(ByVal lptr As Long) As Long ' By KarCrack
   If bInitialized Then getDWord = makeDWord(getWord(lptr + &H0), getWord(lptr + &H2))
End Function

Public Sub putByte(ByVal lptr As Long, ByVal bByte As Byte) ' By KarCrack
   If bInitialized Then bvHack(lptr - lHackDelta) = bByte
End Sub

Public Sub putWord(ByVal lptr As Long, ByVal iWord As Integer) ' By KarCrack
   If bInitialized Then Call putByte(lptr + &H0, iWord And &HFF): Call putByte(lptr + &H1, (iWord And &HFF00&) / &H100)
End Sub

Public Sub putDWord(ByVal lptr As Long, ByVal lDWord As Long) ' By KarCrack
   If bInitialized Then Call putWord(lptr + &H0, IIf(lDWord And &H8000&, lDWord Or &HFFFF0000, lDWord And &HFFFF&)): Call putWord(lptr + &H2, (lDWord And &HFFFF0000) / &H10000)
End Sub

Public Function makeDWord(ByVal LoWord As Integer, ByVal HiWord As Integer) As Long '[http://www.xbeat.net/vbspeed/c_MakeDWord.htm#MakeDWord05]
   makeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
End Function

'   //  Funciones agregadas...

Function makeWord(ByVal lByte As Byte, ByVal hByte As Byte) As Integer ' By BlackZeroX
   makeWord = (((hByte And &H7F) * &H100&) Or lByte)
   If hByte And &H80 Then makeWord = makeWord Or &H8000
End Function

'/////////////////////
Public Function allocMem(ByVal lSize As Long) As Long
'   //  By BlackZeroX (Thanks to Karcrack).
'   //  Retorna la Dirrecion de un SafeArray.
Dim pBuff()     As Byte
   If (lSize <= &H0) Then Exit Function
   ReDim pBuff(0 To (lSize - 1))
   allocMem = getDWord(VarPtrArr(pBuff))
   putDWord VarPtrArr(pBuff), 0
End Function

Public Function reallocMem(ByVal lptr As Long, ByVal lSize As Long) As Long
'   //  By BlackZeroX (Thanks to Karcrack).
'   //  Retorna la Dirrecion de un SafeArray que se retorno en allocMem()/reallocMem().
Dim pBuff()     As Byte
   putDWord VarPtrArr(pBuff), lptr
   If Not (lSize = &H0) Then
       ReDim Preserve pBuff(0 To (lSize - 1))
   Else
       Erase pBuff
   End If
   reallocMem = getDWord(VarPtrArr(pBuff))
   putDWord VarPtrArr(pBuff), 0
End Function

Public Function getMemData(ByVal lptr As Long) As Long
'   //  By BlackZeroX (Thanks to Karcrack).
'   //  lPtr debe ser el valor (Address) que retorno en allocMem()/reallocMem().
'   //  Esta funcion retorna la Dirrecion de memoria EDITABLE de lPtr (Dirrecion de un SafeArray).
'   //  Referencias.
'   //  http://msdn.microsoft.com/en-us/library/aa908603.aspx
   If (lptr = &H0) Then Exit Function
   getMemData = getDWord(lptr + &HC)    '   //  obtenemos pvData
End Function

Public Sub releaseMem(ByVal lptr As Long)
'   //  By BlackZeroX (Thanks to Karcrack).
'   //  lPtr debe ser la Dirrecion que retorno en allocMem()/reallocMem().
Dim pBuff()     As Byte
   putDWord VarPtrArr(pBuff), lptr
End Sub

Public Sub releaseMemStr(ByVal lptr As Long)
'   //  By BlackZeroX (Thanks to Karcrack).
'   //  lPtr debe ser la Dirrecion que retorno en cloneString().
Dim sStr        As String
   putDWord VarPtr(sStr), lptr
End Sub

Public Sub swapVarPtr(ByVal lpVar1 As Long, ByVal lpVar2 As Long)
'   //  By BlackZeroX (Thanks to Karcrack).
Dim lAux    As Long
   lAux = getDWord(lpVar1)
   Call putDWord(lpVar1, getDWord(lpVar2))
   Call putDWord(lpVar2, lAux)
End Sub

Public Function cloneString(ByVal lpStrDst As Long, ByVal sStrSrc As String) As Long
'   //  By BlackZeroX (Thanks to Karcrack).
'   //  lPtr -> Puntero a una variable destino (Preferiblemente String).
'   //  sStr -> Cadena Clonada ( gracias a Byval ).
Dim lpStrSrc        As Long
   If Not (lpStrDst = &H0) And (mMemoryEx.initialize = True) Then
       Call mMemoryEx.swapVarPtr(lpStrDst, VarPtr(sStrSrc))
       Call mMemoryEx.swapVarPtr(VarPtr(cloneString), VarPtr(sStrSrc))
   End If
End Function

Public Function copyMemory(ByVal lpDst As Long, ByVal lpSrc As Long, ByVal lLn As Long) As Long
'   //  By BlackZeroX (Thanks to Karcrack).
Dim i       As Long
   If (lpSrc = &H0) Or (lpDst = &H0) Or (lLn = &H0) Then Exit Function
 
   i = (lLn Mod 4)
   If ((i And &H2) = &H2) Then
       Call putWord(lpDst, getWord(lpSrc))
       lpDst = (lpDst + 2)
       lpSrc = (lpSrc + 2)
       copyMemory = (copyMemory + 2)
       lLn = (lLn - 2)
   End If
   If ((i And &H1) = &H1) Then
       Call putByte(lpDst, getByte(lpSrc))
       lpDst = (lpDst + 1)
       lpSrc = (lpSrc + 1)
       copyMemory = (copyMemory + 1)
       lLn = (lLn - 1)
   End If
   For i = 0 To (lLn - 1) Step 4
       Call putDWord(lpDst + i, getDWord(lpSrc + i))
   Next
   copyMemory = (copyMemory + lLn)
 
End Function



Dulces Lunas!¡.
#624
mmm...



Almenos que uses ASM (Quizas)... pero el procesador va a hacer algo similar...

Dulces Lunas!¡.
#625


#include <stdio.h>
#include <stdlib.h>

unsigned int getNumbers(char* szIn, char* szBuffer, size_t sizeBuffer);

int main()
{
    char szCadena[] = {"ewiuc3dskhd8nkd62ndsnk9"};
    char* szBuffer = NULL;
    size_t size = getNumbers(szCadena, NULL, 0); // Cuantos numeros hay?...

    if (size > 0)
    {
        szBuffer = (char*)malloc(size + 1);
        printf("%d\n", getNumbers(szCadena, szBuffer, size));
        printf("%s\n", szBuffer);
        free(szBuffer);
    }
    getchar();

    return EXIT_SUCCESS;
}

unsigned int getNumbers(char* szIn, char* szOut, size_t sizeBuffer)
{
    unsigned int iRet = 0;

    while(*szIn)
    {
        if (sizeBuffer == 0 && szOut)
            break;

        if ((*szIn) >= '0' && '9' >= (*szIn) )
        {
            if (szOut)
            {
                (*szOut++) = (*szIn);
                --sizeBuffer;
            }
            iRet++;
        }
        szIn++;
    }

    if (szOut)
        *szOut = (char)0x0;

    return iRet;
}





#include <stdio.h>
#include <stdlib.h>

unsigned int getNumbers(char* szIn, char* szBuffer, size_t sizeBuffer);

int main()
{
    char szCadena[] = {"ewiuc3dskhd8nkd62ndsnk9"};
    char* szBuffer = NULL;
    size_t size = getNumbers(szCadena, NULL, 0); // Cuantos numeros hay?...

    if (size > 0)
    {
        szBuffer = (char*)malloc(size + 1 - 3);
        printf("Se extrayeron: %d de %d\n", getNumbers(szCadena, szBuffer, size - 3), size);
        printf("%s\n", szBuffer);
        free(szBuffer);
    }
    getchar();

    return EXIT_SUCCESS;
}



Dulces Lunas!¡.
#627
Modifique un poco tu codigo...

A por cierto conio.h es solo bajo Windows... pero tu decide si la quieres o no usar.



#include <stdio.h>
#include <stdlib.h>//funcion malloc()
#include <string.h> // funcion strcpy()

#define MAX_REG 20 //Define el maximo numero de registros
#define MAX_CONCEPTO 30+1
#define MAX_RFC 21+1


// Primero definimos los tipos
typedef struct registro1
{
    char concepto[MAX_CONCEPTO];
    char RFC[MAX_RFC];
    float monto;
    int mes;
    struct registro1* next;

}INGRESO,   //  Tipo..
*LPINGRESO; //  Puntero a un Tipo en lugarde esrbir *INGRESO se escribe LPINGRESO

LPINGRESO introduceRegistro(LPINGRESO lpIngreso, int* iCount, int iMaxReg, int addIn);//le pasamos el puntero original de la lista
int releaseIngresos(LPINGRESO lpIngreso);
LPINGRESO getLastIngreso(LPINGRESO lpIngreso);

int main()
{
    LPINGRESO lpIngreso = NULL;
    printf("\nIngresa los datos del registro \n");

    lpIngreso = introduceRegistro(lpIngreso,    //  Empesamos desde este registro... obviamente como es NULL creara un nuevo registro...
                                  NULL,
                                  MAX_REG,
                                  1);
    printf("%d\n", releaseIngresos(lpIngreso));
    getchar();

    return EXIT_SUCCESS;
}

//  Libera TODOS LOS NODOS siguientes de INGRESO...
int releaseIngresos(LPINGRESO lpIngreso)
{
    int iRet = 0;

    if (lpIngreso)
    {
        iRet = 1 + releaseIngresos(lpIngreso->next);    //  Liberamos los hijos...
        free(lpIngreso);                            //  Liberamos...
    }
    return iRet;
}

//  Retorna el ultimo registro...
LPINGRESO getLastIngreso(LPINGRESO lpIngreso)
{
    if (lpIngreso)
        while (lpIngreso->next)
            lpIngreso = lpIngreso->next;
    return lpIngreso;
}

/// La función va a retornar un LPINGRESO al 1er elemento INGRESO...
LPINGRESO introduceRegistro(LPINGRESO lpIngreso,    //  Lista desde donde se empesara a crear...
                            int* iCount,            //  Ouput Retorna la cantidad de registros creados...
                            int iMaxReg,            //  MAXIMO de registros a crear...
                            int addIn)              //  Si lpIngreso->next apunta a otro registro, los registros a crear se deben insertarse:
                                                    //  -1 Creamos lo registros entre lpIngreso y lpIngreso->next...
                                                    //  0 Eliminar TODOS apartir de lpIngreso->next e insertar los nuevos.
                                                    //  1 Inserta los registros al final al final de la lista.
                                                    //  Se ignora este parametro si lpIngreso es NULL.
{
    int i = 0;
    LPINGRESO lpNewIngreso = NULL;
    LPINGRESO lpNextStaticIngreso = NULL;
    LPINGRESO lpFirtsIngreso = lpIngreso;

    /// Si lpIngreso ya tiene otros registros enlazados podemos hacer tres cosas
    if (lpIngreso)
        switch(addIn)
        {
            case -1:    //  Agregamos los nuevos seguido a lpIngreso pero antes de lpIngreso->next
                lpNextStaticIngreso = lpIngreso->next;
                break;

            case 0:     //  Eliminamos TODOs lo registros desde lpIngreso->next...
                releaseIngresos(lpIngreso->next);
                break;

            default:    //  Buscamos el ultimo de la lista y empesamos a agregarlos apartir de este.
                lpIngreso = getLastIngreso(lpIngreso);
                break;
        }

    for(i = 0
        //, lpIngreso->next == NULL ->> No tiene caso comprobar con NULL... creo que querias asignarle NULL, ¿no?.
        ;i < iMaxReg;  //  Cantidad de registros...
        i++)           //  Contador creciente en 1.
    {
        lpNewIngreso = (LPINGRESO)malloc(sizeof(INGRESO));

        if (!lpNewIngreso)  //  Se reservo la memoria deseada?...
            break;  //  Salimos del for()...

        memset(lpNewIngreso, 0, sizeof(INGRESO));   //  Limpiamos el bloque de memoria...

        if (!lpFirtsIngreso)
            lpFirtsIngreso = lpNewIngreso;

        //  Enlazamos con el anterior...
        if (lpIngreso)
            lpIngreso->next = lpNewIngreso;

        lpIngreso = lpNewIngreso;

        /// El llenado de datos se puede hacer despues de haber creado los elementos...
        /*
        fprintf(stdout, "Concepto:\n");
        fgets(lpIngreso->concepto, MAX_CONCEPTO - 1, stdin);    //  Hay que leer solo la longitud requerida...

        fprintf(stdout, "RFC:\n");
        fgets(lpIngreso->concepto, MAX_RFC - 1, stdin);    //  Hay que leer solo la longitud requerida...

        fprintf(stdout, "Monto:\n");
        scanf("%f", &lpIngreso->monto);

        fprintf(stdout, "Mes:\n");
        scanf("%d", &lpIngreso->mes);
        */
    }

    if (iCount)
        (*iCount) = i;

    lpIngreso->next = lpNextStaticIngreso;

    return lpFirtsIngreso;
}



Dulces Lunas!¡.
#628
Es una simple regla de tres siguiendo esta presima:

1024 KB/s = 1000 KiB/s

por lo tanto 512 KiB/s a KB/s es:

512 KiB/s * 1024 KB/s / 1000 KiB/s = 524.288 KB/s
Reduciendo:
512 KiB/s * 1.024 KB/KiB = 524.288 KB/s

en resumen:

KiB/s multiplica por 1.024 KB/KiB para pasarlo a KB/s

Dulces Lunas!¡.
#629
corrige este trozo:

Código (vb) [Seleccionar]


If dios.State <> 7 Then
dios.SendData Imagen
dios.SendData "Fin"
Else
MsgBox ("no ESTAS conectado")
End If



por este otro:

Código (vb) [Seleccionar]


If dios.State = 7 Then
    dios.SendData Imagen
    dios.SendData "Fin"
Else
    MsgBox ("no ESTAS conectado")
End If



Esta es la lista de estados:



typedef enum sckState
{
    SCKCLOSED                   = 0,    /** Socket Cerrado completamente **/
    SCKOPEN                     = 1,    /** Socket actualmente Abierto **/
    SCKLISTENING                = 2,    /** Socket a la escucha de una conexion entrante **/
    SCKCONNECTIONPENDING        = 3,    /** Estado de conexxion pendiente del Socket **/
    SCKRESOLVINGHOST            = 4,    /** Se esta resolviendo los datos del equipo Host **/
    SCKHOSTRESOLVED             = 5,    /** Estado donde se indica que los Datos del otro Punto han sido completados **/
    SCKCONNECTING               = 6,    /** Se esta realizando una conexión **/
    SCKCONNECTED                = 7,    /** El Socket esta actualmente conectado **/
    SCKCLOSING                  = 8,    /** El Socket se esta cerrando actualmente **/
    SCKERROR                    = 9,    /** Estado que informa de un Error en el la clase **/
} SCKSTATES;



NOTAS:
* timer1 deberias de activarlo en el evento connect.
* Tanto el OCX de Winsock como CSocketMaster SON IDENTICOS!¡, en la unica cosa que difieren en en que el OCX tiene "close" y el CSocketMaster tiene "closesck", de hay en fuera ambos se manejan de la misma manera.

Dulces Lunas!¡.
#630
Cita de: _Enko en  4 Enero 2012, 16:27 PM
ring0, kernel, drivers, root kit.... visual basic...

que han fumado? :silbar:

Nada de eso es posible en visual basic.
Cualquiera que lo haya sugerido, estuvo totalmente fuera de  lugar.
(hay que mirar el subforo donde se encuentran antes de responder barbaridades)

De que se puede se puede, que te va a costar un huevo (Más pasos de lo común, dolores de cabeza, evitar usar las funciones de vb6 como son &, mid, split, usar type library para las APIS en la IAT, usar Outputdebugstring y DebugView, detener la compilacion de vb6 y asi tomar el archivo objeto y despues seguir con la DDK respectiva, linkear,  que si no se compilo bien, que se te paso un paso, etc...) es otro tema y excesivamente complejo, mejor pasar de largo en este lenguaje y hacerlo en C.

Dulces Lunas!¡.