Estoy trabajando en un Obfuscator de VBScript en Java, tengo un lector de archivos simple como se muestra:

public static List<String> read(File file) {

    List<String> content = new ArrayList<>();

    try {

        BufferedReader reader = new BufferedReader(new FileReader(file));

        String line;

        while ((line = reader.readLine()) != null)
            content.add(line + "\n");

        reader.close();

    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return content;

}

He utilizado esta función de lectura para extraer todos los datos de un archivo VBS proporcionado:

Dim a, b, c, d, e, f

Set a = 0
Set b = 1
Set c = 2
Set d = 3
Set e = 4
Set f = 5

Así que ahora me quedo con una ArrayList con el contenido como se muestra:

['Dim a, b, c, d, e, f', Set a = 0, Set b = 1, Set c = 2, Set d = 3, Set e = 4, Set f = 5]

Sin embargo, estoy intentando "reescribir" esta lista para que se parezca más a esto:

[Dim a, Dim b, Dim c, Dim d, Dim e, Dim f, Set a = 0, Set b = 1, Set c = 2, Set d = 3, Set e = 4, Set f = 5]

¿Cómo haría para hacer esto?

Entonces puedo continuar con el resto de mi aplicación, por lo que necesito que el archivo de salida se vea algo de acuerdo con esto con la entrada proporcionada:

Dim a
Dim b
Dim c
Dim d
Dim e
Dim f

Set a = 0
Set b = 1
Set c = 2
Set d = 3
Set e = 4
Set f = 5

Ojalá haya elaborado lo suficiente .. (Perdón si el formato no es el ideal este es mi primer post: P)

Además, por favor, no comente sobre todo el asunto "si no está roto, por qué arreglarlo" o "por qué reinventar la rueda". Soy consciente de que hay un ofuscador de vbscript público.

-2
StrixxDev 16 oct. 2018 a las 01:59

2 respuestas

La mejor respuesta

Debe averiguar qué condición es necesaria para evaluar si una línea tiene uno o varios valores.

En el ejemplo que proporcionó, podría ser la presencia o ausencia de comas o el signo igual.

De hecho, podría hacerlo dentro de la función del lector para obtener la lista adecuada en primer lugar.

Algo como esto:

public static List<String> read(File file) {

List<String> content = new ArrayList<>();

try {

    BufferedReader reader = new BufferedReader(new FileReader(file));

    String line;

    while ((line = reader.readLine()) != null)
        content.add(getLineContent(line));

    reader.close();

} catch (Exception ex) {
    ex.printStackTrace();
}

return content;

}

private static String getLineContent(String line, List<String> content) {
    return line.contains(",") 
         ? getMultiValueContent(line)
         : line + "\n";
}

private static String getMultivalueContent(String line) {
    String multivalue;
    String[] values = line.replaceAll(",", "").split(" ");
    String typeValue = values[0];
    IntStream.range(1, values.size)
        .forEach(index -> multivalue = String.join("", multivalue, typeValue, values[index], "\n"))
    return multivalue; 
}

¡Espero que ayude!

1
Tomaz Fernandes 15 oct. 2018 a las 23:31

Estoy de acuerdo con @shmosel, verifique si la cadena contiene Dim.

int i = 0;
if(line.Contains("Dim"))
    {
    String parts[] = line.Split(",");
    String newString = parts[i];
    content.add(newString + "\n");
    }

Asegúrese de que el alcance del int sea correcto, esto deberá repetirse para obtener cada "newString". Puede hacer esto con su while () actual o, alternativamente, hacer la verificación de contiene. ("Dim") en otro while ( ) debajo de la actual.

0
Chris 15 oct. 2018 a las 23:34