Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: SpesMod en 2 Febrero 2014, 18:19 pm



Título: Ayuda - Leer Caracter por Caracter
Publicado por: SpesMod en 2 Febrero 2014, 18:19 pm
Buenas, ando practicando esta programacion y la verdad se me anda complicando un poquito, vengo de C/C++ y lo que les voy a consultar ahora es un chancay de a 20 en C/C++ pero aqui en Bat se me hace dificil; bueno ahi va:

Resulta que quiero hacer un bat que lea un archivo *.txt caracter por caracter y a medida que lee los caracteres los vaya guardando en otro archivo pero con el valor ascii alterado sumandole 5, por ejemplo:

Tengo el archivo FUENTE.TXT cuyo contenido es "hola"; el bat deberia hacer:

lee "h", le suma 5 obteniendo "m" y guarda "m" en un nuevo archivo por ejemplo RESULTADO.TXT
lee el siguiente caracter "o", le suma 5 obteniendo "t" y añade "t" en RESULTADO.TXT
lee el siguiente caracter "l", le suma 5 obteniendo "q" y añade "q" en RESULTADO.TXT
lee el siguiente caracter "a", le suma 5 obteniendo "f" y añade "f" en RESULTADO.TXT

El resultado serian 2 archivos:

FUENTE.TXT cuyo contenido seria "hola"
RESULTADO.TXT cuyo contenido seria "mtqf" que en realidad es "hola" pero sumandole 5 posiciones ascii a cada uno de los caracteres.

Creo haberme explicado bien y en realidad se que mi problema es muy sencillo para ustedes, en C/C++ esto lo podria hacer en menos de 5 lineas, pero aqui no me sale; asi que espero que me puedan ayudar.
gracias de antemano :) ;D


Título: Re: Ayuda - Leer Caracter por Caracter
Publicado por: Eleкtro en 2 Febrero 2014, 19:08 pm
es un chancay de a 20 en C/C++ pero aqui en Bat se me hace dificil

Claro, Batch no dispone prácticamente de NADA util ni muhco menos de métodos/comandos para manejar ASCII o HEX para rotar caracteres (aunque se pueden improvisar cosas con el viejo truco del Exit Code).

¿Y si utilizas VBS (que lo puedes ejecutar como si se tratase de un archivo Bat) para escribir tu método de cifrado Caesar?:

Cita de: http://demon.tw/programming/vbs-caesar.html
Código
  1. WScript.Echo Caesar("hola",5)
  2.  
  3. Function Caesar(str,rotation)
  4.  
  5. Dim length,char,i
  6. Caesar = ""
  7. length = Len(str)
  8. For i = 1 To length
  9. char = Mid(str,i,1)
  10. If char >= "A" And char <= "Z" Then
  11. char = Asc("A") + (Asc(char) - Asc("A") + rotation) Mod 26
  12. Caesar = Caesar & Chr(char)
  13. ElseIf char >= "a" And char <= "z" Then
  14. char = Asc("a") + (Asc(char) - Asc("a") + rotation) Mod 26
  15. Caesar = Caesar & Chr(char)
  16. Else
  17. Caesar = Caesar & char
  18. End If
  19. Next
  20.  
  21. End Function

Saludos


Título: Re: Ayuda - Leer Caracter por Caracter
Publicado por: SpesMod en 2 Febrero 2014, 19:34 pm
Hola, un gusto y gracias por responder tan pronto; en tu solucion el argumento está predefinido, como archivo VBS tendria que pasarle el archivo txt como argumento variable, no siempre va a contener lo mismo, ademas quisiera tambien poder enviarle el numero 5 como argumento.
Este VBS lo tendría que ejecutar con CALL desde otro bat verdad?, como lo ejecuto y le mando estos parametros (archivo y 5) para que los procese?
Gracias!


Título: Re: Ayuda - Leer Caracter por Caracter
Publicado por: Eleкtro en 3 Febrero 2014, 07:03 am
como lo ejecuto y le mando estos parametros (archivo y 5) para que los procese?

No te lo tomes a mal pero para venir de un lenguaje como C/C++ te veo bastante perezoso para Googlear información básica (el manejo de argumentos en X lenguaje) :¬¬ ~> http://ss64.com/vb/arguments.html

Entonces deberías reemplazar esta orden:
Citar
Código
  1. WScript.Echo Caesar("hola",5)

Por esta otra:
Código
  1. WScript.StdOut.Write(Caesar(WScript.Arguments(0), WScript.Arguments(1)))

Para llamar al Script y redireccionar la salida del Script a un archivo de texto puedes hacerlo así:
Código
  1. Cscript.exe //NoLogo "Caesar.vbs" "hola" 5 > "RESULTADO.TXT"

Como viste en el ejemplo uso un string como parámetro y no un archivo de texto "fuente.txt", la razón es que usar archivos de texto en mi opinión es primitivo, estoy convencido de que podrías trabajar diréctamente con Strings sin necesidad de crear/manipular archivos secundarios en el HDD, de todas formas te muestro los cambios que deberías hacer al Script VBS para tomar un archivo de texto como primer argumento:

Código
  1. ' Cojo la primera linea del archivo que le pases como argumento.
  2. str = Split(CreateObject("Scripting.FileSystemObject"). _
  3. OpenTextFile(WScript.Arguments(0), 1).ReadAll(), vbnewline)(0)
  4.  
  5. WScript.StdOut.Write(Caesar(str, WScript.Arguments(1)))

En la consola...:
Código
  1. Cscript.exe //NoLogo "Caesar.vbs" "FUENTE.TXT" 5 > "RESULTADO.TXT"

Saludos!