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

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ... 45
101  Programación / Programación C/C++ / Re: Archivos en C en: 26 Agosto 2016, 09:30 am
Lo primero si que lo tuve en cuenta en el código. Lo segundo, pues no :P
102  Programación / Programación C/C++ / Re: Archivos en C en: 26 Agosto 2016, 04:59 am
1.-Si leo un archivo en binario (por ejemplo un pdf) y lo copio a otro archivo, que guardo como pdf, el documento resulta ilegible. Entiendo que ésto es porque el archivo original tiene un formato determinado, que al copiar bit a bit no se mantiene o que hay que interpretar de algún modo. Imagino la copia (bueno de hecho así la veo cuando la abro con el editor de texto) como una montaña absurda de caracteres descabellados que hay que organizar de algún modo, pero intuyo que es algo bastante complejo.

Eso es rotundamente falso. Si abres un archivo en binario, copias byte a byte y lo guardas en otro archivo con la misma extensión, debería ser una copia exacta, y como tal, no debería haber problemas con la copia. Te dejo un código que copia exactamente un archivo a otro:

Código
  1. #include <string.h>
  2. #include <stdio.h>
  3.  
  4. #define MAX_PATH 4096
  5.  
  6. int main() {
  7. // Puedes poner MAX_PATH como quieras, o saber este valor a través de librerías
  8. // no estándares
  9. char ruta_entrada[MAX_PATH];
  10. char ruta_salida[MAX_PATH];
  11. FILE *entrada;
  12. FILE *salida;
  13. char byte;
  14. int salir = 0;
  15.  
  16. // Obtenemos rutas
  17. fprintf(stdout, "Introduzca la ruta del archivo a copiar: ");
  18. fgets(ruta_entrada, MAX_PATH, stdin);
  19. ruta_entrada[strlen(ruta_entrada) - 1] = '\0';
  20. fprintf(stdout, "Introduzca la ruta del archivo de destino: ");
  21. fgets(ruta_salida, MAX_PATH, stdin);
  22. ruta_salida[strlen(ruta_salida) - 1] = '\0';
  23.  
  24. // Abrimos archivos
  25. entrada = fopen(ruta_entrada, "rb");
  26. if(NULL == entrada) {
  27. fprintf(stderr, "Error abriendo archivo de entrada en '%s'\n", ruta_entrada);
  28. perror("Detalles");
  29. return -1;
  30. }
  31.  
  32. salida = fopen(ruta_salida, "wb");
  33. if(NULL == salida) {
  34. fprintf(stderr, "Error abriendo archivo de salida en '%s'\n", ruta_salida);
  35. perror("Detalles");
  36. return -1;
  37. }
  38.  
  39. // Copiando datos
  40. while(0 == salir) {
  41. byte = fgetc(entrada);
  42.  
  43. if(0 == feof(entrada)) {
  44. fputc(byte, salida);
  45.  
  46. if(0 != ferror(entrada) || 0 != ferror(salida)) {
  47. fprintf(stderr, "Error leyendo|escribiendo byte\n");
  48. perror("Detalles");
  49. return -1;
  50. }
  51. } else {
  52. salir = 1;
  53. }
  54. }
  55.  
  56. // Terminando...
  57. fprintf(stdout, "La copia de archivos ha finalizado\n");
  58.  
  59. fclose(entrada);
  60. fclose(salida);
  61. return 0;
  62. }

Evidentemente, esto no es lo más básico, sino que es una forma "muy segura" de copiar archivos (se podrían haber omitido la comprobación de que los archivos existen, los mensajes de error...)

Espero que te sea de ayuda.

PD.: Probé el código con un PDF, y funcionó perfectamente :D
103  Programación / Programación General / Re: (Consulta) (Bajo nivel) ¿Las variables se guardan en la pila o en el ejecutable? en: 25 Agosto 2016, 14:14 pm
Vaale. De acuerdo. Muchas gracias!
104  Programación / ASM / [NASM] (Duda) El registro DS no funciona como debería en: 25 Agosto 2016, 03:07 am
Hola, muy buenas. Estaba viendo cómo se hacía una unidad de arranque desde ensamblador (NASM), pero tengo problemas con el registro DS. Muestro este código para mostrar mi duda:

Código
  1. BITS 16
  2.  
  3. start:
  4. xor ax, ax                 ; Set data segment to where we're loaded
  5. mov ds, ax
  6.  
  7. mov ax, text_string
  8. add ax, 7C00h
  9. mov si, ax                 ; Put string position into SI
  10. call print_string          ; Call our string-printing routine
  11.  
  12. jmp $                      ; Jump here - infinite loop!
  13.  
  14.  
  15. text_string: db 'This is my cool new OS!', 0
  16.  
  17.  
  18. print_string:                      ; Routine: output string in SI to screen
  19. mov ah, 0Eh                ; int 10h 'print char' function
  20.  
  21. .repeat:
  22. lodsb                      ; Get character from string
  23. cmp al, 0
  24. je .done                   ; If char is zero, end of string
  25. int 10h                    ; Otherwise, print it
  26. jmp .repeat
  27.  
  28. .done:
  29. ret
  30.  
  31.  
  32. times 510-($-$$) db 0      ; Pad remainder of boot sector with 0s
  33. dw 0xAA55

Es un código sencillito, pero funciona. El problema está en que si hago que el registro DS valga 0x07C0, el ordenador no arranca con esta unidad de arranque, pero si calculo manualmente la dirección de la cadena de texto y hago que DS valga 0, el ordenador si que arranca con esta unidad.

Código con el que funciona:
Código
  1. BITS 16
  2.  
  3. start:
  4. xor ax, ax                 ; Lo ponemos como 0
  5. mov ds, ax
  6.  
  7. mov ax, text_string        ; Calculo manualmente la dirección de la caedna
  8. add ax, 7C00h
  9. mov si, ax                 ; La guardo en SI
  10.  
  11.        ...

Código con el que no funciona:
Código
  1. BITS 16
  2.  
  3. start:
  4. mov ax 0x07C0          ; Lo ponemos como 0
  5. mov ds, ax
  6.  
  7. mov ax, text_string    ; El cálculo debería ser DS * 0x10 + SI, lo que es lo mismo que
  8.                               ; 0x07C0 * 0x10 + SI, lo que es lo mismo que 0x7C00 + SI, que
  9.                               ; a su vez es lo mismo que el cálculo manual antes expuesto
  10. mov si, ax             ; La guardo en SI
  11.  
  12.        ...

O hay algo que se me escapa, o es muy extraño todo... Gracias de antemano!



Vale, me he dado cuenta de que xor limpia parte/todo el registro FLAGS

He obtenido el registro con LAHF. Antes de usar xor, LAHF retornaba, en binario, 01000110, y después de usar xor, LAHF retornaba 00000000. He intentado hacer lo siguiente, pero sigue sin funcionar:

Código
  1. mov ah, 0x00
  2. SAHF
  3. CLC
  4. CLD
  5. CLTS
  6. mov ax, 0x07C0
  7. mov ds, ax

Pero con este código si que funciona (algo hace XOR de lo que no me doy cuenta...):
Código
  1. xor ax, ax            ; Algo más tiene que hacer XOR, porque aun reemplazando el valor de ax, sin XOR no funciona
  2. mov ax, 0x07C0        ; Aquí reemplazamos todo ax
  3. mov ds, ax

Espero que me puedan ayudar :D
105  Programación / Programación General / (Consulta) (Bajo nivel) ¿Las variables se guardan en la pila o en el ejecutable? en: 24 Agosto 2016, 23:54 pm
Hola, muy buenas, me explico. La pregunta que tengo es dónde se guardan las variables. Yo tenía entendido que se guardan en un especie de bloque de memoria asignado para cada programa llamado 'pila', pero según estoy leyendo por ahí, las variables pueden ser guardadas entre código y código del ejecutable. En ensamblador, por ejemplo, podríamos escribir 'mylabel: db 'Message here', 0' (ejemplo de Internet). En ese espacio del ejecutable, se guarda una serie de bytes que contienen "Message here", por lo que podrías decir que esa memoria está entre código y código, no en la 'pila'

Espero que mi duda se haya entendido, no sabía muy bien como explicarla... ¡Muchas gracias de antemano!
106  Programación / Programación C/C++ / Re: Cómo codificar con estilo (broma) en: 24 Agosto 2016, 22:07 pm
Jajaja, habrá que ver que nos podemos inventar
107  Programación / Programación C/C++ / Cómo codificar con estilo (broma) en: 24 Agosto 2016, 20:44 pm
Si eres como esas personas que codifican sin poner tabulaciones, espacios, deja los códigos super comprimidos y la gente no le gusta tu estilo, ¡¡aquí te traigo la forma de seguir con tu estilo y además de una forma bonita!!

Código
  1.          #include<stdio.h>
  2.  
  3.  
  4.  
  5.  
  6.                 int
  7.                main(
  8.               ){float
  9.              rad=0.0f;
  10.             float peri;
  11.            float   areac
  12.           =.0f;     const
  13.          float       pi_2=
  14.         1.5707f;char*areas=
  15.        "Area";fprintf(stdout
  16.       ,"Radio: ");scanf("%f",
  17.      &rad);              peri=
  18.     4.00f                 *pi_2
  19.    *rad;                   areac
  20.   =2.0f                     *pi_2
  21.  *rad*                       *&rad
  22. ;fprintf                     (stdout,
  23.  
  24.  
  25.  
  26.  
  27. "Perimeter: %f\n",peri);fprintf(stdo\
  28. ut,"%s: %f",areas, areac); return 0;}

Para aquel que se lo pregunte, como si no estuviera claro, este código te pide un radio para calcular su perímetro y área asociado

¡Espero que adoptéis este estilo tan maravilloso de programación!
108  Programación / Programación C/C++ / Re: Problema con la derivación de clases c++ en: 24 Agosto 2016, 20:28 pm
Yo acabo de compilar el código, y hay MUCHIIISIMOS más errores que los que mencionas... Simplemente voy a poner un ejemplo para que no se me tome por mentiroso:

Código:
C:/MinGW64/mingw64/x86_64-w64-mingw32/include/c++/ostream:574:5: note:   templat
e argument deduction/substitution failed:
clasesvehiculo/vehiculo.cpp:109:52: note:   cannot convert 'Vehiculo::mostrarPre
cio()' (type 'void') to type 'const unsigned char*'
                 cout << "Precio: " << mostrarPrecio() << endl;
                                                    ^

Ese error viene de este fragmento:

Código
  1. void Vehiculo::mostrarPrecio()
  2. {
  3.        return precio;
  4. }
  5.  
  6. [...]
  7.  
  8. void Vehiculo::mostrarVehiculo()
  9. {
  10.        [...]
  11.        cout << "Precio: " << mostrarPrecio() << endl;
  12. }

La función, en teoría, tendría que retornar algo, pero le pusiste que retornara void...

Por si quieres la lista completa de errores lanzada por MinGW, aquí la tienes:
http://www.mediafire.com/download/lcchftx34bpjhah/log.txt

Para que veas la cantidad de errores, el archivo ocupa 211 KB XDD
109  Programación / Programación General / Re: No puedo usar acentos ni ñ en Python 2.7.7 en: 23 Agosto 2016, 11:43 am
El código ASCII como tal solo recoge los primeros 127 caracteres de la tabla, en la cual no están ni la ñ ni las vocales acentuadas. Por lo tanto, en la cabecera de tu programa tendrás que especificar que vas a usar una codificación ASCII extendida, la codificación UTF-8. Aquí tienes lo que tienes que incluir:

Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
110  Programación / Programación General / Re: Resto de un numero natural de 200 digitos en: 23 Agosto 2016, 06:22 am
Aquí dejo un programa que hice en C para un problema de Project Euler. El programa calcula la suma total de los dígitos de factorial de 200 (en realidad, el ejercicio pedía de 100, pero puse 200 para que tuviera más de 200 dígitos). En el programa, para obtener los dígitos, tengo que sacar el módulo, así que funciona correctamente (lo digo porque Project Euler dictaminó que mi respuesta era buena).

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. typedef struct {
  5. unsigned char *bytes;
  6. unsigned int num_bytes;
  7. } big_int;
  8.  
  9. void set_big_int(big_int *result, unsigned char number);
  10. void multiply(big_int *result, unsigned char number);
  11. void divide(big_int *result, unsigned char denominator);
  12. unsigned char get_module(big_int *result, unsigned char denominator);
  13. void factorial(big_int *result, unsigned char number);
  14. int is_zero(big_int *big_integer);
  15.  
  16. int main() {
  17. big_int big_integer = {NULL, 0};
  18. unsigned char digit;
  19. unsigned int num_digits = 0;
  20. unsigned int result = 0;
  21.  
  22. fprintf(stdout, "Adding all digits of 200!...\n");
  23.  
  24. factorial(&big_integer, 200);
  25.  
  26. while(is_zero(&big_integer) == 0) {
  27. num_digits++;
  28.  
  29. digit = get_module(&big_integer, 10);
  30. fputc(digit + '0', stdout);
  31. result += digit;
  32.  
  33. divide(&big_integer, 10);
  34. }
  35.  
  36. fprintf(stdout, "\n\nDigit sum result: %u\n", result);
  37. fprintf(stdout, "Number of digits: %u", num_digits);
  38.  
  39. fgetc(stdin);
  40. return 0;
  41. }
  42.  
  43. void set_big_int(big_int *result, unsigned char number) {
  44. if(result->bytes != NULL)
  45. free(result->bytes);
  46.  
  47. result->bytes = malloc(sizeof(unsigned char));
  48. result->bytes[0] = number;
  49. result->num_bytes = 1;
  50. }
  51.  
  52. void multiply(big_int *result, unsigned char number) {
  53. register int i;
  54. unsigned int rest = 0;
  55.  
  56. for(i = 0; i < result->num_bytes; i++) {
  57. rest = result->bytes[i] * number + rest;
  58. result->bytes[i] = rest & 0x000000FF;
  59. rest >>= 8;
  60.  
  61. if(rest != 0 && i+1 == result->num_bytes) {
  62. result->num_bytes += 1;
  63. realloc(result->bytes, result->num_bytes);
  64. result->bytes[i+1] = 0;
  65. }
  66. }
  67. }
  68.  
  69. void divide(big_int *result, unsigned char denominator) {
  70. register int i;
  71. unsigned int module = 0;
  72. unsigned int new_size = result->num_bytes;
  73.  
  74. for(i = result->num_bytes-1; i >= 0; i--) {
  75. module = (unsigned int)result->bytes[i] + (module << 8);
  76. result->bytes[i] = module/denominator;
  77. module %= denominator;
  78. }
  79.  
  80. for(i = result->num_bytes-1; i >= 0 && result->bytes[i] == 0; i--)
  81. new_size--;
  82.  
  83. if(new_size != result->num_bytes) {
  84. result->num_bytes = new_size;
  85. realloc(result->bytes, new_size);
  86. }
  87. }
  88.  
  89. unsigned char get_module(big_int *result, unsigned char denominator) {
  90. register int i;
  91. unsigned int module = 0;
  92.  
  93. for(i = result->num_bytes-1; i >= 0; i--)
  94. module = ((unsigned int)result->bytes[i] + (module << 8))%denominator;
  95.  
  96. return module;
  97. }
  98.  
  99. void factorial(big_int *result, unsigned char number) {
  100. unsigned char i;
  101.  
  102. set_big_int(result, 1);
  103. for(i = 2; i <= number; i++)
  104. multiply(result, i);
  105. }
  106.  
  107. int is_zero(big_int *big_integer) {
  108. register unsigned int i;
  109. unsigned int result = 1;
  110.  
  111. for(i = 0; result == 1 && i < big_integer->num_bytes; i++)
  112. result = big_integer->bytes[i] == 0;
  113.  
  114. return result;
  115. }

Además, le he agregado para que imprima los dígitos en Little Endian, así que la salida del programa para calcular el factorial de 200 sería...

Código:
00000000000000000000000000000000000000000000000002747379830732698722222987169785
80071532604230714091306220668659755047521230423093757042424257723584928247221314
68192330452042466154126544229349889693732713367072758264311139928259426629160501
73624209724675203883691983121277140932648911048240302924330436994495344233524749
2362371786779531592260581239312363255305097463768756887

Digit sum result: 1404
Number of digits: 375
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ... 45
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines