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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 [2] 3 4 5 6 7 8 9 10
11  Programación / Programación C/C++ / Re: Duda adivinar numero sin fallar en: 29 Junio 2019, 00:06 am
Como todos saben, rand() es seudoaleatorio. Más, la implementación de la función rand() en la librería estándar de C usa el Generador linear congruencial, un algoritmo muy simple para obtener números seudoaleatorios, y es fácilmente predecible.
12  Programación / Programación C/C++ / Probar si varios bits están "seteados" en: 15 Junio 2019, 07:17 am
Buenas, tal cual en el título, nececito probar si varios bits de una variable estan "seteados" osea valen 1 (como saben bit 0 o 1).
Puedo comprobar un solo bit con:
Código
  1. if (variableacomprobar & indexdelbit) {
  2.    /* etc... */
  3. }
  4.  
Pero como lo hago para varios a la vez?
Por ejemplo, tengo una varible con dos bits que quiero comprobar a la vez:
Bits 7 y 6: quiero comprobar si el uno (bit 7) y el cero (bit 6) valen 1 y viceversa. Osea:
Código:
|15...|7|6|5|4|3|2|1|0|
       | |
       1 0
     Ó
       0 1
Espero haberme explicado bien, cualquier confusión preguntenme por aclaración. :)
13  Programación / Programación C/C++ / Re: [C] Tratando de crear array de strings en: 9 Junio 2019, 02:22 am
No es que no lo haya tratado, publicaste tu respuesta cuando estaba escribiendo la mía, perdón por eso.
La razón de por que se repite cuatro veces es por que la función read_bpb se ejecutaba 4 veces por un for.
Problema solucionado, gracias y perdón por gastar su tiempo.
Saludos.
14  Programación / Programación C/C++ / Re: [C] Tratando de crear array de strings en: 9 Junio 2019, 00:33 am
Bien, ha vuelto a funcionar otra vez milagrosamente y espero que no se vuelva a romper.
El tema es este ahora:
Código
  1. printf("\nFile %s", s[2])
Se ejecuta 3 veces mas sin razón aparente, sin estar dentro de ningún ciclo (for, while, do-while...)
Cuando se ejecuta esas 3 veces mas no imprime el elemento que está en s[2], pero la primera vez si. No es el problema que no se imprima las tres veces, es por que se ejecuta tres veces esa línea sin razón aparente

Código
  1. /* Problema solucionado con padding */
  2. char* s[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  3. void read_directory(void)
  4. {
  5. /* Read the directory */
  6. hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
  7.  
  8. int aaa = 0;
  9. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  10. if (drce[i].file_name[0] == 0x00) {
  11. printf("\n-- END --\n");
  12. break;
  13. }
  14. /* File has a long file name */
  15. if ((drce[i].attributes & 0x0F) == 0x0F) {
  16. s[i] = 0;
  17. continue;
  18. }
  19.  
  20. /* "File" is a directory */
  21. if ((drce[i].attributes & 0x10) == 0x10){
  22. printf("Directory name: %s\n", drce[i].file_name);
  23. s[i] = 0;
  24. continue;
  25. }
  26.  
  27. /* If the first byte of file_name is 0xE5, means that the file is deleted */
  28. if (drce[i].file_name[0] == FAT32_DELETED_FILE)
  29. continue;
  30. /* This should print the names of the files that are in the root directory... */
  31. printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
  32. s[aaa] = drce[i].file_name;
  33. ++aaa;
  34. ++files_in_directory;
  35. }
  36. }
  37.  
  38. void read_bpb(uint32_t offset)
  39. {
  40. /* Read the BPB (BIOS parameter block) - Lee el BPB (Bloque de parámetros de la BIOS) */
  41. hd_read(offset, FATBPB_SIZE, (uint8_t*)&bpb);
  42.  
  43. fat_start = (offset + bpb.reserved_sectors);
  44. fat_size = bpb.sectors_per_fat;
  45. start_of_data = fat_start + (fat_size * bpb.fats_number);
  46. start_of_root = start_of_data + ((bpb.cluster_root - 2) * bpb.sectors_per_cluster);
  47. root_dir_sects = ((bpb.root_dir_entries * 32) + (bpb.bytes_per_sector - 1) / bpb.bytes_per_sector);
  48. data_sects = (bpb.reserved_sectors + bpb.fats_number * (bpb.sectors_per_fat + root_dir_sects));
  49. cluster_count = data_sects / bpb.sectors_per_cluster;
  50.  
  51. read_directory();
  52. printf("\nFile %s", s[2]); /* Se ejecuta 3 veces sin razon */
  53. }
15  Programación / Programación C/C++ / Re: [C] Tratando de crear array de strings en: 8 Junio 2019, 23:39 pm
Igualmente gracias. Es raro por que antes si funcionaba sin problemas, y se rompio todo de la nada.
Saludos  :)
16  Programación / Programación C/C++ / Re: [C] Tratando de crear array de strings en: 8 Junio 2019, 23:16 pm
La nueva variable <aaa> (que espero que le pongas un nombre mejor :xD) controla sólo <files_names_in_dir>. Es decir que tendría que ser:
Código
  1. file_names_in_dir[aaa] = drce[i].file_name;
  2. ++aaa;

De todas formas, por si el error no es sólo ese y no consigues solucionarlo, para la próxima pon la salida que obtienes literalmente para que veamos mejor a qué se puede deber.
Yo quitaría los <continue> de todas formas y los <break> como ya te he comentado... :silbar:
El resultado es el mismo, sobre los continue después lo arreglo...
Bueno, aca la salida literal:
Código:
HELLO   TXT (16 veces)
El feliz pájaro hindú comia feliz cardillo mientras la cigüeña tocaba el saxofón. (16 veces más)
Ni idea de donde salio la ultima string, talvez sucedio la gran casualidad que entre en la memoria de otro proceso que tiene ese string.
17  Programación / Programación C/C++ / Re: [C] Tratando de crear array de strings en: 8 Junio 2019, 22:37 pm
He tratado esto, pero sigue igual, imprime 16 veces la string correctamente y otras 16 basura.
Código
  1. int aaa = 0;
  2. void read_directory(void)
  3. {
  4. /* Read the directory */
  5. hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
  6.  
  7. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  8. if (drce[i].file_name[0] == 0x00) {
  9. kputs("\n-- END --\n");
  10. break;
  11. }
  12. /* File has a long file name */
  13. if ((drce[i].attributes & 0x0F) == 0x0F)
  14. continue;
  15.  
  16. /* "File" is a directory */
  17. if ((drce[i].attributes & 0x10) == 0x10){
  18. kputs("Directory name: %s\n", drce[i].file_name);
  19. continue;
  20. }
  21.  
  22. /* If the first byte of file_name is 0xE5, means that the file is deleted */
  23. if (drce[i].file_name[0] == FAT32_DELETED_FILE)
  24. continue;
  25. /* This should print the names of the files that are in the root directory... */
  26. printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
  27. file_names_in_dir[aaa] = drce[aaa].file_name;
  28. ++files_in_directory;
  29. ++aaa;
  30. }
  31. }
  32.  
O es que soy tonto o no he dormido nada que estoy bien palurdo.  :P
18  Programación / Programación C/C++ / Re: [C] Tratando de crear array de strings en: 8 Junio 2019, 21:40 pm
Puedes publicar todo el código?
Estás usando variables como ++files_in_directory;
Qué no sé exactamente lo que hace.

Qué es la basura? Direcciones de memoria? Espacios? El caracter null terminator \o?

El files_in_directory no esta relacionado. Creo que la basura es un salto extraño de memoria, ya que de ahi me imprime una string que no tiene nada que ver. Ese string basura no se relaciona de ninguna manera con el array de string que trato de imprimir.
Ah y el código completo (comentarios en ingles, pero los traduzco):
Código
  1. #include <stdio.h>
  2. #include "hd.h" /* No relacionado con la falla */
  3. char* file_names_in_dir[16];
  4. void read_directory(void)
  5. {
  6. /* lee el directorio */
  7. hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
  8.  
  9. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  10. if (drce[i].file_name[0] == 0x00) {
  11. printf("\n-- END --\n");
  12. break;
  13. }
  14. /* el archivo tiene un nombre largo */
  15. if ((drce[i].attributes & 0x0F) == 0x0F)
  16. continue;
  17.  
  18. /* el seudoarchivo es en realidad un directorio */
  19. if ((drce[i].attributes & 0x10) == 0x10){
  20. printf("Directory name: %s\n", drce[i].file_name);
  21. continue;
  22. }
  23.  
  24. /* el archivo no existe */
  25. if (drce[i].file_name[0] == FAT32_DELETED_FILE)
  26. continue;
  27. printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
  28. file_names_in_dir[i] = drce[i].file_name;
  29. ++files_in_directory;
  30. }
  31. }
  32.  
  33. void read_bpb(uint32_t offset)
  34. {
  35. /* Read the BPB (BIOS parameter block) - Lee el BPB (Bloque de parámetros de la BIOS) */
  36. hd_read(offset, FATBPB_SIZE, (uint8_t*)&bpb);
  37.  
  38. fat_start = (offset + bpb.reserved_sectors);
  39. fat_size = bpb.sectors_per_fat;
  40. start_of_data = fat_start + (fat_size * bpb.fats_number);
  41. start_of_root = start_of_data + ((bpb.cluster_root - 2) * bpb.sectors_per_cluster);
  42. root_dir_sects = ((bpb.root_dir_entries * 32) + (bpb.bytes_per_sector - 1) / bpb.bytes_per_sector);
  43. data_sects = (bpb.reserved_sectors + bpb.fats_number * (bpb.sectors_per_fat + root_dir_sects));
  44. cluster_count = data_sects / bpb.sectors_per_cluster;
  45.  
  46. read_directory();
  47. printf("%s", file_names_in_dir[0]);
  48. }
  49.  
19  Programación / Programación C/C++ / [C] Tratando de crear array de strings en: 8 Junio 2019, 20:54 pm
Buenas, he estado tratando de crear un array de strings, para luego leer todas sus strings.
Código
  1. /* Reservamos 16 elementos de string */
  2. char* file_names_in_dir[16];
  3. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  4.        ...
  5. if (drce[i].file_name[0] == 0x00)
  6. break;
  7. file_names_in_dir[i] = drce[i].file_name;
  8. ++files_in_directory;
  9. }
  10. ...
  11. printf("%s", file_names_in_dir[0]);
  12. ...
  13.  
El tema es que funciona, pero luego de imprimir la string correctamente le sigue basura.
por ejemplo, file_names_in_dir[0] es "HELLO TXT", pero luego la string sigue, pero con basura.
Alguna idea? Gracias.
20  Programación / Programación General / Bug en GDB? en: 3 Junio 2019, 06:12 am
Buenas. Érase un día normal y corriente, yo programando y buscando bugs con mi que creía fiel debugger GDB. El tema es que de la nada los breakpoints dejaron de funcionar, asi por si nada, sin haber hecho ninguna cosa rara, obiamente haciendo el debugger inútil  ;-)
Estoy haciendo una sesión remota; (target remote localhost:1234), luego cargé los símbolos (symbol-file foo.elf)
y luego el breakpoint (b syscall.c:27).
Pero aparece: No line 27 in file "syscall.c". y luego Make breakpoint pending on future shared library load? (y or [n]). Siendo que el archivo syscall.c y la línea 27 existen.
Le doy a Y, y nada, de por sí por que no sirve, y luego N, y aun así nada. El breakpoint nunca existió.

La versión de mi debugger es GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git.
Un bug? Alguna solución? Estoy desesperado sin mi debugger :S
Saludos
PD: GDB y sesión remota son de la misma arquitectura (x86_64)
Páginas: 1 [2] 3 4 5 6 7 8 9 10
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines