Ir al contenido


Foto

Pequeñas rutinas en C/C++


  • Por favor identifícate para responder
6 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 20 febrero 2009 - 04:40

Como un hilo similar está abierto, y se creo el subforo de C, me parece coherente abrir este hilo. Aquí las primeras aportaciones:



cpp
  1. // Rutina de encriptación Xor.
  2. // La misma rutina encripta y desencripta.
  3. // Clave clave en modo texto que se tratará como de 8 caracteres, 64 bits
  4. // Mod es el módulo restante para encriptaciones parciales si no desea usarse,
  5. // debe ser nulo
  6. // Si se encripta un buffer por partes, Mod = Size_encriptado%8
  7. // donde Size_encriptado es el tamaño total de lo encriptado hasta ese momento.
  8. // Mod corrige el punto de comienzo del nuevo bloque a encriptar.
  9. // BYTE es unsigned char
  10.  
  11. void
  12. Crypt(void *Source, int Size, char* Clave, int Mod)
  13. {
  14.   BYTE *source = (BYTE*)Source;
  15.   BYTE clave[8];
  16.   int lClave = strlen(Clave);
  17.   for(int n=0; n<8; n++)
  18.     clave[n] = Clave[n%lClave];
  19.  
  20.   for(int n=0; n<Size; n++, Mod++){
  21.       source[n] ^= clave[Mod%lClave];
  22.   }
  23. }





cpp
  1. // Elimina los espacios en blanco a la derecha de la cadena truncando.
  2. char* trim(char *cadena)
  3. {
  4.   int n;
  5. for(n=strlen(cadena)-1; n>=0 && cadena[n]==' '; n--); n++;
  6. cadena[n]='\0';
  7. return (char *)cadena;
  8. }





cpp
  1. // Elimina los espacios en blanco a la izquierda de la cadena copiandola a su comienzo.
  2. char*  ltrim(char *cadena)
  3. {
  4.   return strrev(trim(strrev(cadena)));
  5. }



Saludos.

Edito: Me tome la libertad de modificar tu etiqueta de c++, estamos creando los botones de C# y C++.

Por el momento puedes usarlo así (manualmente)

[nobbc][code=cpp]Código C++[/code][/nobbc]
[nobbc][code=csharp]Código C#[/code][/nobbc]


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 febrero 2009 - 05:05

Me tome la libertad de modificar tu etiqueta de c++, estamos creando los botones de C# y C++.

Por el momento puedes usarlo así­ (manualmente)


[nobbc][code=cpp]Código C++[/code][/nobbc]
[nobbc][code=csharp]Código C#[/code][/nobbc]

Gracias, no habí­a vuelto a ver el post hasta ahora. Imagino que lo editaste tu, enecumene.

Aprovecho para dejar otras pequeñas pero útiles rutinas en C:


cpp
  1. // Obtener el nombre completo, con ruta, de una dll
  2. // Una dll puede conocer su nombre
  3. char* GetDllFileName(HINSTANCE hinst, char* Buffer, int SizeBuffer)
  4. {
  5.   GetModuleFileName(hinst, Buffer, SizeBuffer);
  6.   return Buffer;
  7. }



Y por concordancia:


cpp
  1. // Obtener el nombre completo, con ruta, del proceso actual
  2. char* GetCurrentFullExeName(char* Buffer, int SizeBuffer )
  3. {
  4.   GetModuleFileName(GetModuleHandle(0), Buffer, SizeBuffer);
  5.   reurn Buffer;
  6. }



Otra forma de conocer el nombre del proceso actual, esta vez sólo el nombre del ejecutable:


cpp
  1. // conocer el nombre del proceso actual
  2. bool GetCurrentExeName(char* Buffer, int SizeBuffer )
  3. {
  4.   bool Result = false;
  5.   PROCESSENTRY32 proc = { sizeof(proc) };
  6.   HANDLE hSysSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  7.   DWORD PId = GetCurrentProcessId();
  8.   if(SizeBuffer<6) return false;
  9.   *Buffer = 0;
  10.   if(hSysSnapshot != reinterpret_cast<HANDLE>(-1) && Process32First(hSysSnapshot, &proc)){
  11.     do{
  12.         if(PId == proc.th32ProcessID){
  13.           strncpy(Buffer, proc.szExeFile, SizeBuffer);
  14.           Result = true;
  15.           break;
  16.         }
  17.     }while(Process32Next(hSysSnapshot, &proc));
  18.   }
  19.   CloseHandle(hSysSnapshot);
  20.   return Result;
  21. }




Saludos.
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 febrero 2009 - 05:36

Gracias escafandra, pero en realidad la modificó nuestro estimado Egostar, ;).

Saludos.
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 febrero 2009 - 05:39

Bien, pues entonces gracias Egostar. ;)

Saludos.
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 23 febrero 2009 - 06:39

Una de calendario. El problema de las fiestas anuales para ver los dias laborables, no siempre es fácil. Un tema especialmente dificil son las fiestas de la Semana Santa. Aquí­ dejo la forma de calcularlas:



cpp
  1. TDate
  2. GetPascua(int year)
  3. {
  4.   // Limites de la Semana Santa 22 de marzo hasta 25 de abril
  5.   // Solo desde 1900 hasta el año 2100 las cifras 24 y 5 son cte y válidas
  6.   int a = year % 19;
  7.   int b = year % 4;
  8.   int c = year % 7;
  9.   int A = (19*a + 24) % 30;
  10.   int B = (2*+ 4*c + 6*A + 5)%7;
  11.  
  12.   TDate Date = EncodeDate(year, 3, 1);
  13.   return Date + A + B + 22 -1;
  14. }



Este es el Domingo de Pascua. El jueves Santo será, Pascua-3 y el Viernes Santo, Pascua-2.

Saludos.

  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 febrero 2009 - 10:01

Vaya, muy interesante escafandra, me ha gustado esa rutina aunque no uso C++ o C, pero es muy interesante. (y).

Saludos.
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 febrero 2009 - 10:16

Me alegro que te parezca interesante. Aquí­ la tienes en delphi. :D

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.