Autor Tema: Pequeñas rutinas en C/C++  (Leído 1478 veces)

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

Desconectado escafandra

  • Moderadores
  • ******
  • Gracias
  • -Dados: 62
  • -Recibidos: 477
  • Mensajes: 1,939
  • Calificaciones: +513/-0
  • Sexo: Masculino
Pequeñas rutinas en C/C++
« en: 20 de Febrero de 2009, 16:40:56 »
Como un hilo similar está abierto, y se creo el subforo de C, me parece coherente abrir este hilo. Aquí las primeras aportaciones:

Código 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. }

Código 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. }
  9.  

Código 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. }
  6.  

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)

Citar
[code=cpp]Código C++[/code]
[code=csharp]Código C#[/code]
« última modificación: 06 de Junio de 2010, 09:57:52 por escafandra »



Desconectado escafandra

  • Moderadores
  • ******
  • Gracias
  • -Dados: 62
  • -Recibidos: 477
  • Mensajes: 1,939
  • Calificaciones: +513/-0
  • Sexo: Masculino
Re:Pequeñas rutinas en C/C++
« Respuesta #1 en: 21 de Febrero de 2009, 17:05:38 »
Citar
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)

Citar
[code=cpp]Código C++[/code]
[code=csharp]Código C#[/code]
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:
Código 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:
Código 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:
Código 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. }
  22.  


Saludos.
« última modificación: 21 de Febrero de 2009, 17:08:38 por escafandra »

Desconectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 271
  • -Recibidos: 213
  • Mensajes: 4,910
  • Calificaciones: +271/-1
  • Sexo: Masculino
  • DA Webmaster
Re:Pequeñas rutinas en C/C++
« Respuesta #2 en: 21 de Febrero de 2009, 17:36:31 »
Gracias escafandra, pero en realidad la modificó nuestro estimado Egostar, ;).

Saludos.

Desconectado escafandra

  • Moderadores
  • ******
  • Gracias
  • -Dados: 62
  • -Recibidos: 477
  • Mensajes: 1,939
  • Calificaciones: +513/-0
  • Sexo: Masculino
Re:Pequeñas rutinas en C/C++
« Respuesta #3 en: 21 de Febrero de 2009, 17:39:24 »
Bien, pues entonces gracias Egostar. ;)

Saludos.

Desconectado escafandra

  • Moderadores
  • ******
  • Gracias
  • -Dados: 62
  • -Recibidos: 477
  • Mensajes: 1,939
  • Calificaciones: +513/-0
  • Sexo: Masculino
Re:Pequeñas rutinas en C/C++
« Respuesta #4 en: 23 de Febrero de 2009, 18:39:48 »
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:

Código 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*b  + 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.

Desconectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 271
  • -Recibidos: 213
  • Mensajes: 4,910
  • Calificaciones: +271/-1
  • Sexo: Masculino
  • DA Webmaster
Re:Pequeñas rutinas en C/C++
« Respuesta #5 en: 23 de Febrero de 2009, 22:01:19 »
Vaya, muy interesante escafandra, me ha gustado esa rutina aunque no uso C++ o C, pero es muy interesante. (y).

Saludos.

Desconectado escafandra

  • Moderadores
  • ******
  • Gracias
  • -Dados: 62
  • -Recibidos: 477
  • Mensajes: 1,939
  • Calificaciones: +513/-0
  • Sexo: Masculino
Re:Pequeñas rutinas en C/C++
« Respuesta #6 en: 24 de Febrero de 2009, 10:16:03 »
Me alegro que te parezca interesante. Aquí­ la tienes en delphi. :D

Saludos.
« última modificación: 24 de Febrero de 2009, 10:17:55 por escafandra »