elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28 29 30 31 32 33
191  Programación / Programación C/C++ / Re: Simulacion de Comunicacion. en: 18 Noviembre 2018, 00:18 am
Lo unico que pruebas, al menos con el programa de test que pusiste previamente, es que la funcion rand() tiene un comportamiento como el que esperas, o sea, que 1 de cada 100 elementos sea elegido, pero esto no implica que 1 de cada 100 elementos tu eligiras de los primeros 100 bits.  

Si le dieras a la funcion rand() los 100 primeros elementos, esta elegiria solo 1 de alli, pero tu no haces esto, le dices a la funcion rand() que eliga uno por uno, cada bit, con probabilidad 1/100. Con ello, tu programa podria elegir varios bits en el camino, y es esto efectivamente lo que ocurre. Varias veces rand() elige alguno de los bits. Aunque rand() este bien, eso no implica que cualquier uso de rand() hara que los resultados esten correctos. No importa cuantas veces lo ejecutes.

El no generar elecciones ya hechas se puede resolver, por ejemplo, manteniendo lo disponible. En vez de guardar lo elegido y comparar si ya ha sido elegido antes., por ejemplo asi:

Código
  1. int noise(char * data_stream, int len_data, unsigned char cuantos, unsigned char valor) {
  2.  int index;
  3.  int bit;
  4.  int cantidad_bits = len_data * 8;
  5.  
  6.  int disponible[100];
  7.  
  8.  for (int offset = 0; offset < cantidad_bits; offset += 100) {
  9.    for (int i = 0; i < 100; i++) disponible[i] = i;
  10.    for (int bits_modificados = 0; bits_modificados < cuantos; bits_modificados++) {
  11.      int r = rand() % (100 - bits_modificados);
  12.      int bit_offset = disponible[r] + offset;
  13.      disponible[r] = disponible[99 - bits_modificados];
  14.  
  15.      if (bit_offset >= cantidad_bits) {
  16.        continue;
  17.      }
  18.      index = bit_offset / 8;
  19.      bit = bit_offset % 8;
  20.      if (valor) {
  21.        data_stream[index] |= 1 << bit;
  22.      } else {
  23.        data_stream[index] &= ~(1 << bit);
  24.      }
  25.    }
  26.  }
  27. }
  28.  
192  Programación / Programación C/C++ / Re: como se libera la memoria de un arbol? en: 17 Noviembre 2018, 23:40 pm
free libera la memoria, delete es mas poderoso, pues si se trata de un puntero a un objeto, invoca al destructor del mismo (y libera la memoria despues).

La combinacion alloc (o malloc) y free, no se intercambia con new y delete, si solicitaste memoria con new, libera con delete, si pediste con alloc (o alguno de sus parientes), liberas con free.
193  Programación / Programación C/C++ / Re: Simulacion de Comunicacion. en: 17 Noviembre 2018, 20:42 pm
Estoy de acuerdo que la cuenta se puede mejorar, lo indique también en el comentario que acompaña. Gracias!
194  Programación / Programación C/C++ / Re: Simulacion de Comunicacion. en: 17 Noviembre 2018, 19:46 pm
La manera de probar que el codigo original es cercano a lo que se pide no esta bien.
El test solo muestra que la funcion de probabilidad te sirve, no que su uso esta bien,

Recuerda que tienes que modificar a lo mas <cuantos> bits por cada 100 de ellos.
Esto no te lo da la solucion propuesta, porque usas la probabilidad en tamanos distintos de 100 (aunque usas el 100 para controlar si aplicar el cambio o no al bit visitado), por lo que es bien posible que se modifiquen mas que <cuantos> bits, como te ocurre. Contabilizar los cambios para corregir esto solamente va a tener bias favoreciendo a los primeros cambios.

Si modificas tu funcion noise original, para avanzar a traves del conjunto de caracteres cada 100 bits, aun usando la funcion de probabilidad, tu resultado sera mas cercano al correcto, nunca modificando mas de los bits que son necesarios.

Mucha teoria, lo que indico, usando parte de lo que enviaste, corrigiendo de acuerdo a lo que propongo.

Código
  1. int noise(char *data_stream,int len_data,unsigned char cuantos, unsigned char valor) {
  2. int index;
  3. int bit;
  4. int offset;
  5. int bit_offset;
  6. int bits_modificados;
  7. int cantidad_bits = len_data * 8;
  8.  
  9. for(int offset = 0; offset < cantidad_bits; offset += 100) {
  10.     for( bits_modificados = cuantos; bits_modificados > 0; bits_modificados--) {
  11.     bit_offset = rand() % 100 + offset;
  12.     if( bit_offset > cantidad_bits) {
  13.        continue;
  14. }
  15.     index = bit_offset / 8;
  16.     bit = bit_offset % 8;
  17.     if(valor) {
  18.   data_stream[index] |= 1 << bit;
  19. } else {
  20.                    data_stream[index] &= ~(1 << bit);
  21. }
  22.       }
  23. }
  24. }


Lo pruebas asi:

Código
  1. #define LARGO 100 // 1 cambio cada 100 bits seran 8 cambios en total (a lo mas).
  2.  
  3. int main() {
  4. srand(time(NULL));
  5. char data[LARGO+1] = {0};
  6. for( int test = 0; test < 100; test++ ) {
  7.           memset(data,0,LARGO);
  8.   noise(data,LARGO,1,1);
  9.           // lo correcto es contar los bits modificados, pero si tenemos suerte
  10.           // solo se ha modificado 1 bit por caracter
  11.   int count = 0;
  12.   for(int i = 0; i < LARGO; i++) {
  13.       if(data[i] != 0) {
  14.           count++;
  15.       }
  16.   }
  17.   printf("Mensaje despues del ruido: %d modificaciones\n", count);
  18. }
  19. }
  20.  
  21.  
195  Programación / Programación C/C++ / Re: [C++] Programa queda congelado al usar destructor en: 17 Noviembre 2018, 19:00 pm
Elimina la invocacion del destructor explicita. Deja que el objeto se destruya solo al morir el programa.
196  Programación / Programación C/C++ / Re: Simulacion de Comunicacion. en: 17 Noviembre 2018, 17:07 pm
Repito, porque decidiste ignorar la pregunta:

Si "cuantos" tiene valor 1, y tienes 100 bits en total.

cuantos bits tienes que modificar de esos 100 bits?
cuantos modificas?
197  Programación / Programación C/C++ / Re: Simulacion de Comunicacion. en: 17 Noviembre 2018, 16:58 pm
Para entender lo que tu crees que estas haciendo, comparado con lo que se pide:

Si "cuantos" tiene valor 1, y tienes 100 bits en total.

cuantos bits tienes que modificar de esos 100 bits?

yo digo que tienes que modificar 1 de ellos, aleatoriamente elegido, y no es lo que haces.

El que muestres que los datos han sido modificados, no implica que las modificaciones estan bien hechas.



198  Programación / Programación C/C++ / Re: Simulacion de Comunicacion. en: 17 Noviembre 2018, 16:41 pm
Mira la descripcion que mandaste:

a) cuantos bits con ruido por cada 100 bits.

no es lo que haces.
199  Programación / Programación C/C++ / Re: Simulacion de Comunicacion. en: 17 Noviembre 2018, 16:35 pm
floor() es superfluo. La division de enteros da entero siempre.

Sugiero revisar la logica, pues el codigo no parece calzar con lo que se pide.

"cuantos" deberia indicar cuantos bits modificar cada 100 bits, pero el codigo modifica los primeros "cuantos" bits, no es lo mismo.

Dicho en numeros:
no es lo mismo modificar 3 bits aleatoriamente, que modificar los primeros 3 bits.
200  Programación / Programación C/C++ / Re: como se libera la memoria de un arbol? en: 17 Noviembre 2018, 16:09 pm
Tener referencias hacia nodos liberados tendrá problemas si decides desrefenciarlas, si no es así, no habrá problema alguno.
Páginas: 1 ... 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28 29 30 31 32 33
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines