2010-02-18 11 views
5

Vorrei scrivere un Perl one-liner per decodificare una linea di caratteri ASCII codificati come numeri esadecimali (ad esempio la linea 48 54 54 50 deve essere decodificato come HTTP). Mi sono inventato questo:Come posso usare un Perl one-liner per decodificare una stringa ASCII codificata in esadecimale?

perl -nE 'say map(chr, map { qq/0x$_/ } split)' 

Stampa una riga vuota. Cosa sto sbagliando e come lo scriveresti?

+1

'perl -lnE 'y/// d; dì pacco "H *", $ _ '' – hobbs

risposta

6

E 'il tuo qq/0x$_/ trucco che non funziona. chr si aspetta un numero come argomento, ma ottiene la stringa letterale "0x48". Utilizzare la funzione per convertire hex48 in un numero decimale, come datageist fa in his answer.

questo funziona per me:

echo '48 54 54 50' | perl -nE 'say map(chr, map { hex } split)' 
+1

Nelle one-liners funziona solo con '-E' (al contrario di' -e'), ma immagino che l'abbia già capito. Sicuramente batte 'stampa" $ _ \ n "'. – zoul

+0

Grazie per avermelo fatto notare, ho dovuto tornare indietro e leggere perldoc ancora una volta: D –

+1

Il tuo 'map()' sembra terribilmente incoerente. C'è qualcosa di sbagliato in 'map (chr, map (hex, split))'? –

6

Questo funziona:

echo '48 54 54 50' | perl -nE 'say map{chr(hex)} split' 

sto supponendo che si desidera inserire i dati da STDIN.

+0

Grazie, non sapevo' hex'. – zoul

+0

Prego. Grazie per aver corretto la formattazione sul post. :) – datageist

3

gioco perlgolf?

-ple y/0-9A-Fa-f//cd;$_=pack"H*",$_ 
-ple $_=pack"H*",$_,join"",split 
-nE say map chr hex,split 
-naE say map chr hex,@F 
6

Come sempre con Perl TIMTOWTDI.

ho pensato di presentare diverse opzioni, e mostrare ciò che sarebbe simile se fossero scritte normalmente. Se vuoi saperne di più sulle opzioni della riga di comando, perldoc perlrun è una risorsa utile.


Questi generano tutti la stessa cosa. Con l'eccezione che alcuni di loro non stampano una nuova riga alla fine.

echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_' 
echo '48 54 54 50' | perl -0x20 -ne'print chr hex$_' 
echo '48 54 54 50' | perl -0777 -anE'say map chr,map hex,@F' 
echo '48 54 54 50' | perl -0777 -anE'say map{chr hex$_}@F' 
echo '48 54 54 50' | perl -0apple'$_=chr hex$_' -0x20 
echo '48 54 54 50' | perl -apple'$_=join"",map{chr hex}@F' 
echo '48 54 54 50' | perl -lanE'say map{chr hex}@F' 

Il seguente è ciò che alcuni degli esempi apparirebbero se fossero scritti normalmente. Se vuoi capire cosa fanno gli altri, guarda sicuramente allo perldoc perlrun.


perl -0x20 -pe'$_=chr hex$_' 

Questo è uno è abbastanza semplice. È forse il miglior esempio qui, ed è anche il più breve. Finge che gli spazi siano usati per separare le linee, in modo che ci sia solo una lettera da trattare all'interno del ciclo.

# perl -0x20 -pe'$_=chr hex$_' 
$/ = " "; # -0 (input separator) 
while(<>){ 
    $_ = chr hex $_; 
} continue { 
    print $_; 
} 

perl -0apple'$_=chr hex$_' -0x20 

Questo ha alcune opzioni della riga di comando che non fanno niente di utile.

  • La prima opzione -0 c'è così che -l imposta il separatore di uscita su una stringa vuota. Quale è in realtà l'impostazione predefinita per il separatore di uscita.
  • Ci sono due opzioni -p in cui uno sarebbe sufficiente.
  • L'opzione -a imposta l'array @F, ma in realtà non lo usiamo.

Fondamentalmente ho usato -a-l e un secondo -p in modo che le opzioni sarebbero incantesimo mela. Altrimenti questo è uguale all'ultimo esempio.

echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_' 
# perl -0apple'$_=chr hex$_' -0x20 
$/ = ""; # -0 (input separator) 
$\ = $/; # -l (output separator) 
$/ = " "; # -0x20 (input separator) 
while(<>){ 
    @F = split " ", $_; # -a (unused) 
    $_ = chr hex $_; 
} continue { 
    print $_; 
} 

perl -lanE'say map{chr hex}@F' 

ho pensato che già farro mela, tanto vale precisare Lane.

  • -l non è molto utile, perché stiamo già utilizzando say.
  • Utilizzato -E anziché -e in modo da poter utilizzare say.
# perl -lanE'say map{chr hex}@F' 
$\ = $/; # -l (output separator set to "\n") 
while(<>){ 
    @F = split " ", $_; # -a 
    say map { chr hex $_ } @F; 
} 
Problemi correlati