• Publicidad

split sin divisores comunes

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

split sin divisores comunes

Notapor MidNight » 2006-05-01 13:31 @605

Hola allá, primero que todo me gustaría felicitar a los creadores y usuarios de este magnífico foro pues se puede encontrar material de muy alta calidad además de un ambiente muy, muy amistoso. Como se puede apreciar es mi primer mensaje, pero visito este sitio hace unos meses y nunca me había surgido la necesidad de mandar alguna duda.

Planteo la escena de mi problema:

He desarrollado un algoritmo de cifrado personal para proteger conversaciones y datos personales. En realidad no me interesa usar programas de cifrado populares como PGP y DES-triple pues a mi modo de ver aunque sean 'invulnerables' aparentemente, son demasiado conocidos para mi gusto.

El caso es que el prototipo que diseñé técnicamente era mucho más simple y muy probablemente muchísimo menos seguro que estos sistemas mencionados anteriormente. Estaba basado en operaciones aritméticas con los códigos ASCII de cada uno de los caracteres; debo decir aunque logré hacerlo funcionar bien y con los pocos conocimientos que poseo de criptoanálisis intenté hacerlo lo más seguro posible pero el desempeño de este no es muy cómodo a mi modo de ver (a razón de 1 MB / 8 s) por lo tanto deseo agilizarlo y he pensado en trabajar con un nuevo método parecido al de las etapas y permutaciones de DES por lo cual necesito dividir la cadena de caracteres del mensaje a cifrar en segmentos de 8 caracteres.

La duda que tengo es la siguiente (que he buscado pero no he podido encontrar):

¿Con la función split() puedo hacerlo poniendo algún tipo de delimitador intrínseco en ella que me permita indicar la cantidad de caracteres a dividir?

Agradecería que por favor me pudieran informar, en el caso de que no se pueda (como lo sospecho pero prefiero preguntar) si conocen alguna manera rápida y eficiente que crean que podría utilizar. Apreciaría mucho que me la hicieran ver...

Un saludo y gracias.
Imagen
Avatar de Usuario
MidNight
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2006-04-29 13:31 @604

Publicidad

Notapor explorer » 2006-05-01 14:09 @631

Pues no... split() está preparado para dividir una secuencia de caracteres según un delimitador...

Se podría usar como delimitador el patrón /(.....)/ para que nos devolviera conjuntos de números de ese largo, pero rellenaría el array con muchos valores nulos (porque split() cree que entre dos conjuntos de números (que son los delimitadores) está el valor que realmente nos interesa (un nulo), cuando no es así.

Para dividir una cadena o secuencia de caracteres, se suele usar substr() o mejor, unpack:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -l
  2. use warnings;
  3. use strict;
  4.  
  5. my @lang = ( 'A' .. 'Z', 0 .. 9 );
  6. my $code = join '', map { $lang[rand @lang] } 1..30;
  7. print $code;      # 9KFV19DFCSM8BNP59SD97FAOG06YTS
  8.  
  9. my @chuncks = unpack( "(A5)*", $code );
  10.  
  11. print "@chuncks"; # 9KFV1 9DFCS M8BNP 59SD9 7FAOG 06YTS
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2006-05-01 14:32 @647, editado 2 veces en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor MidNight » 2006-05-01 14:18 @637

Hola, explorer, muchas gracias por el código con unpack().

Había pensado algo similar con substr() pero no me parecía muy eficiente. Ahora unpack() me parece una opción formidable aunque se me dificulta un poco esta magnifica función.

De nuevo, muchísimas gracias le echaré una leída al perldoc para implementarla lo mejor posible.

Un saludo.
Imagen
Avatar de Usuario
MidNight
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2006-04-29 13:31 @604


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados