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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 ... 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 [159] 160 161
1581  Programación / Programación C/C++ / Re: ¿Se puede añadir una funcion a string.h? en: 25 Diciembre 2015, 01:23 am
Muy buenas.

Pues hay unos cuantos bugs.
Línea 14, 16 y 20: debes cambiar la forma con que haces el incremento. No te interesa el valor que hay guardado en el puntero, solo incrementarlo. Eso es cambiar *var++ por var++.

Por otra parte cuándo la cadena original no tiene separador, el separador es el primer carácter, o hay pocos caracteres en la cadena apuntada por s hay basura en las cadenas s y t.
1582  Programación / Programación C/C++ / Re: Ayuda menu en: 24 Diciembre 2015, 18:46 pm
Muy buenas.

Pues eso es porque cuándo has introducido la opción a la siguiente ejecución del menú en el bufer del teclado sigue quedando el carácter de nueva línea. Éste es aceptado por scanf y la ejecución continua.

Inserta el código en tu switch y lo verás
Código
  1.  case '\n':
  2.      printf("*** NL ***\n");

Debes encontrar una forma de eliminar el este carácter del buffer después del scanf.

Eso sí, fflush(stdin); no es la forma  :rolleyes:
1583  Programación / .NET (C#, VB.NET, ASP) / Re: Quiero controlar el DexDrive en: 24 Diciembre 2015, 14:28 pm
Muy buenas.

Buscando un poco porqué el DexDrive terespondía IAI!, que no parece ser una respuesta ID válida después de INIT, me he encontrado con un código en C# que se comunica con DexDrive. Mirándolo un poco por encima se ve que hay que hacer más cosas que las explicadas en el manual que adjuntaste.

Aquí tienes:
https://github.com/ShendoXT/memcardrex/blob/master/MemcardRex/DexDrive.cs
1584  Programación / .NET (C#, VB.NET, ASP) / Re: Quiero controlar el DexDrive en: 24 Diciembre 2015, 02:09 am
Muy buenas.

Sobre la cadena IAI en toda comunicación el texto dice:

Citar
A cada comando o respuesta le antecede la cadena "IAI" (0x49 0x41 0x49) [...]. Un solo byte las sigue, indicando qué comando o respuesta se está enviando. Pueden seguirle mas bytes, dependiendo del comando o la respuesta exacta; la naturaleza de estos argumentos está listada más abajo por cada comando o respuesta.

Así que según esto toda comunicación, tanto por tu parte, como por el DexDrive tendrá la forma
0x49 0x41 0x49 <byte de comando/respuesta> [<bytes de argumentos>]

El texto dice:
Citar
Cuando un DexDrive se energiza por primera vez, se encuentra en un estado que yo llamo "pouting", y básicamente rechaza realizar cualquier cosa hasta que no se haya inicializado. Cualquier comando válido, a parte de INIT, será respondido mediante POUT, y no sucederá nada.

(El modelo PSX continuará rechazando comandos inválidos con ERROR, mientras el modelo N64, contestará con POUT a todo menos a INIT, siempre y cuando se lleve el prefijo "IAI".)

La para inicializar DexDrive, hay que mandar el comando INIT, seguido por un MAGIC_HANDSHAKE en los subsiguientes 100ms (aprox.) después de recibir la respuesta ID.

Sobre la respuesta de INIT y el ID:
Citar
0x00    INIT

    Argumentos: <17 bytes>
    Respuesta: ID

[...]

0x40    ID

    Argumentos: <byte extraño> <3-bytes modelo> <versión de firmware>

    Identifica el modelo de DexDrive en respuesta a INIT.

    <byte extraño> está derivado de la cadena de 17 bytes mandada con INIT; ver fórmula extraña de mas abajo para mas detalles.

    La cadena 3-bytes modelo es "PSX" o "N64".

    <versión firmware> es la versión firmware x.yz empaquetada en un simple byte de la forma: xxyyyyzz

Sobre la fórmula extraña da el proceso de cómo calcularla, pero hay que tener en cuenta que es algo que hace DexDrive. Por tu parte el sacarla solo te serviría como comprobación. Pero viendo lo que dice el texto el algo que te puedes ahorrar. El texto dice:
Citar
No tengo ni idea de porqué es tan complejo, especialmente por el hecho de que no conduce a ningún sitio. InterAct's DexPlorer no rechazará comunicarse con ningún dispositivo que no produzca el byte esperado, aunque si siempre se envía la misma cadena de 17 bytes, ¿cuál es la idea?. [...]

Básicamente te basta recoger de qué modelo se trata, si PSX o N64, alguna función responde de una forma según el modelo.

Si no sabes inglés te será difícil que puedas crear el programa. Los traductores informáticos no dan buenos resultados a la hora de traducir este texto.

Espero haberte ayudado.
1585  Programación / .NET (C#, VB.NET, ASP) / Re: Quiero controlar el DexDrive en: 23 Diciembre 2015, 15:56 pm
Muy buenas.

Leyendo el txt que adjuntas veo que te has saltado varias cosas.
Cito:
Every command or reply is prefixed with the string "IAI" (0x49 0x41 0x49)
(possibly standing for "InterAct Accessories, Inc.").  A single byte follows,
indicating which command or reply is being sent.


Eso indica que antes de mandar los 17 bytes debes incluir IAI y después un byte con el número de función que vas a llamar, en este caso 00. Con lo que tu lista de bytes quedaría de esta forma

0x49 0x41 0x49 0x00 0x10 0x29 0x23 0xbe 0x84 0xe1 0x6c 0xd6 0xae 0x52 0x90 0x49 0xf1 0xf1 0xbb 0xe9 0xeb

Después de haber mandado esto DexDrive te va a mandar su ID. Desde que recibes esta tienes 100ms para mandar un magic handshake, como te indica el texto en la sección POUTING. Después, como indica la sección MAGIC HANDSHAKE, el firmware para PSX te responderá con un error, mientras que el firmware N64 no responderá nada.

Sobre la configuración del puerto. Cito:
The serial connection with the DexDrive is established at 38400 baud, 8 bits,
no parity, one stop bit (8N1).


Lo único que se desconoce es si usa RTS/CTS: Se dice que habilita estas lineas pero no está claro si las usa o cuando las usa.

Espero haberte ayudado.
1586  Programación / Programación C/C++ / Re: [C] Argumentos anónimos en llamadas a funciones en: 22 Diciembre 2015, 22:25 pm
Cierto, es una conversión. Pero decía de que es extraño porque no se suele ver esta forma de llamar a una función directamente con los datos, siempre se suelen preparar antes en una variable.
1587  Programación / Programación C/C++ / [C] Argumentos anónimos en llamadas a funciones en: 22 Diciembre 2015, 21:48 pm
Muy buenas.

Pues sigo con mi cruzada de autodescubrimiento de gramáticas extrañas que C acepta.

Supongamos la siguiente función que acepta un array de cadenas y las va imprimiendo hasta encontrar una cadena vacía:

Código
  1. void func(char* str[]) {
  2.    int i = 0;
  3.    while(str[i][0] != '\0')
  4.        printf("%s\n", str[i++]);
  5. }

Ante esto uno piensa que para llamar a dicha función debe crear una variable de esta forma
Código
  1. char *lista[] = {"uno", "dos", "tres", "cuatro", "");
y después llamar a la función
Código
  1. func(lista);

Pues se puede llamar a la función pasando un argumento anónimo, la lista entera directamente, de esta forma
Código
  1. func((char*[]){"uno", "dos", "tres", "cuatro", ""});

Obviamente, como siempre, esto se puede modificar al gusto y necesidades de cada uno.

Un programa de prueba completo es este:
Código
  1. #include <stdio.h>
  2.  
  3. void func(char* str[]) {
  4.    int i = 0;
  5.    while(str[i][0] != '\0')
  6.    printf("%s\n", a[i++]);
  7. }
  8.  
  9. int main()
  10. {
  11.    func((char*[]){"uno", "dos", "tres", "cuatro", ""});
  12.    return 0;
  13. }

Ya me diréis que os parece  ;)
1588  Programación / Programación C/C++ / Re: ¿Alguien puede ayudarme a entender este codigo de strstr? en: 22 Diciembre 2015, 16:25 pm
 ;-) Sí, así es  ;-)

Yo tampoco he hecho informática. Soy un autodidáctico de la vida  ;D

Una cosa: aunque tu expresión del while es correcta, para el ordenador, para nos debería reflejarse como

Código
  1. while(*s1 && *s2 && (*s1 == *s2))

Recuerda que lo que quieres decir al compilador y a la gente que ve el código es:
Código
  1. while((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2))
1589  Programación / Programación C/C++ / Re: ¿Alguien puede ayudarme a entender este codigo de strstr? en: 22 Diciembre 2015, 15:47 pm
Muy buenas.

En línea 4:
Código
  1. if (!*str2) return 0;
*str2 se puede traducir a str[0]: valor del primer carácter de la cadena str2.
La exclamación que tiene delante niega lógicamente dicho valor. El valor 0 es el único valor que negado hace que un if ejecute las instrucciones asociadas. Por otra parte un valor 0 en una cadena es el carácter nulo ( '\0' ) de fin de cadena que espera C como marcador de fin de cadena.
Todo ello quiere decir que si str2 es una cadena vacía, sólo compuesta por el carácter de fin de cadena ( "\0" ), el la función retornará 0.
La línea 10 hace lo propio con s2.

En la línea 8:
Código
  1. while (*s1 && *s2 && !(*s1 - *s2))
while ejecuta su código asociado siempre que lo que tenga entre paréntesis sea diferente a 0, la forma en C de decir que una expresión es cierta.
El operador AND lógico ( && ) solo le interesa que sus operandos sean 0 o distinto a 0. *s1 y *s2 son un carácter que, para AND, mientras sean distintos a 0, o como ya hemos visto el carácter de fin de cadena, será cierto.
Donde dice !(*s1 - *s2) se restan dos caracteres. Para C lo que se está es restando los valores numéricos que representan esos caracteres (ASCII), si *s1 y *s2 son iguales el resultado aritmético es 0. Y aquí entra a jugar el operador de negación ( ! ): si resulta que son iguales, valor 0 -> falso, se niega y se convierte en verdadero, con lo que para el conjunto de la instrucción hará que while ejecute sus instrucciones asociadas.
Esto quiere decir que: mientras los caracteres de s1 y s2 no sean el carácter nulo y ambos sean iguales while ejecutará sus instrucciones asociadas.

Aunque la función que has dado es rara, porqué sólo indica que ha hay coincidencia o no. La función de librería estándar devuelve el puntero a la primera ocurrencia en str1 de la cadena apuntada por str2 o un puntero NULL en caso de no haber coincidencias.
1590  Programación / Programación C/C++ / Re: Conectarme a servidor SMTP en: 22 Diciembre 2015, 10:54 am
Muy buenas.

Googleando un poco por ahí he visto que el correo a través de gmail no es tan sencillo. Se espera que se realice una conexión segura y una cifrado base64 del nombre de usuario y contraseña.

Mira el siguiente enlace.

http://stackoverflow.com/questions/11046135/how-to-send-email-using-simple-smtp-commands-via-gmail

Cuándo mandar un correo por telnet, el traducirlo a un programa será pan comido.
Páginas: 1 ... 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 [159] 160 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines