Conversia șirului hexagonal în ascii în linia de comandă bash (Programare, Bash, Hexagonal)

Kerby82 a intrebat.

Am o mulțime de acest tip de șir și vreau să găsesc o comandă pentru a-l converti în ascii, am încercat cu echo -e și od, , dar nu a funcționat.

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2

Comentarii

  • Asta nu seamănă cu ASCII. ASCII nu este definit pentru valori mai mari de 0x7f. –  > Por Mark Byers.
  • Vrei să spui că este binar? –  > Por Kerby82.
  • Vrei să spui int/binary în loc de ASCII? Valorile pe care le-ați arătat sunt mai mari decât intervalul ASCII… –  > Por P.P.
  • Ce te-ai aștepta să obții pentru șirul tău de exemplu? –  > Por Vaughn Cato.
  • m-aș aștepta la un șir imprimabil, dar nu este… ar trebui să fie o parolă în text clar. Dar din ceea ce ai spus bănuiesc că este criptată sau hașurată (versiune binară) –  > Por Kerby82.
7 răspunsuri
Dan Bliss

Acest cod va converti textul 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 într-un flux de 11 octeți cu valori echivalente. Acești octeți vor fi scriși în standard out.

TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ')
for c in $TESTDATA; do
    echo $c | xxd -r
done

După cum au subliniat și alții, acest lucru nu va rezulta într-un șir ASCII imprimabil pentru simplul motiv că octeții specificați nu sunt ASCII. Trebuie să postați mai multe informații despre cum ați obținut acest șir pentru ca noi să vă ajutăm în acest sens.

Cum funcționează: xxd -r traduce datele hexazecimale în binar (ca un hexdump inversat). xxd cere ca fiecare linie să înceapă cu numărul de index al primului caracter de pe linie (rulați hexdump pe ceva și vedeți cum fiecare linie începe cu un număr de index). În cazul nostru, dorim ca acest număr să fie întotdeauna zero, deoarece fiecare execuție are doar o singură linie. Din fericire, datele noastre au deja zerouri înaintea fiecărui caracter, ca parte a notației 0x. X-ul minuscul este ignorat de xxd, așa că tot ce trebuie să facem este să trimitem fiecare caracter 0xhh către xxd și să-l lăsăm să facă treaba.

Tr traduce punctele în spații, astfel încât for să le împartă corect.

Comentarii

  • nu funcționează pentru mine cu xxd –version = xxd V1.10 27oct98 pe Redhat linux nou (cu ksh). Primesc doar un singur caracter §. –  > Por shellter.
  • Este exact ceea ce primesc și eu. Datele nu sunt text, așa că nu se tipăresc foarte bine. Pentru a le vedea într-o formă imprimabilă, puneți codul meu într-o funcție bash, cum ar fi danstest() { … }. Apoi, apelați funcția și direcționați ieșirea către hexdump -C. Acest lucru vă va arăta octet cu octet ce date ies din codul meu. –  > Por Dan Bliss.
  • cool. Poți să faci ` … done | hexdump -C`, nu e nevoie de nicio funcție. Mult noroc tuturor. –  > Por shellter.
  • Mulțumesc! Acesta este singurul lucru care a funcționat pentru mine pe sh. –  > Por Sevastyan Savanyuk.
  • trebuia să utilizați xxd -r -p pentru a obține un șir de caractere de ieșire din „xxd V1.10 27oct98” –  > Por JGurtz.
funroll

Acest lucru a funcționat pentru mine.

$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$

-r îi spune să convertească hexagonal în ascii, spre deosebire de modul său normal de a face opusul.

-p îi spune să folosească un format simplu.

Comentarii

  • pbpaste | xxd -rp din Homebrew pe Mac nu a funcționat, dar pbpaste | xxd -r -p a funcționat ………. –  > Por Pysis.
Raghu Sodha

Puteți folosi ceva de genul acesta.

$ cat test_file.txt
54 68 69 73 20 69 73 20 74 65 78 74 20 64 61 74 61 2e 0a 4f 6e 65 20 6d 6f 72 65 20 6c 69 6e 65 20 6f 66 20 74 65 73 74 20 64 61 74 61 2e

$ for c in `cat test_file.txt`; do printf "x$c"; done;
This is text data.
One more line of test data.

Comentarii

  • Încerc să decodez date misterioase dintr-un joc (Elite: Dangerous) care arată ca o zecimală, acest lucru pare să funcționeze (cu \ în loc de x). (: –  > Por SilverWolf.
WireInTheGhost

Puteți folosi xxd:

$cat hex.txt
68 65 6c 6c 6f
$cat hex.txt | xxd -r -p
hello

Comentarii

  • Cel mai bun răspuns aici dacă ai acces la xxd. –  > Por HeadCode.
Yokai

Valorile pe care le-ați furnizat sunt valori UTF-8. Atunci când sunt setate, matricea de:

declare -a ARR=(0xA7 0x9B 0x46 0x8D 0x1E 0x52 0xA7 0x9B 0x7B 0x31 0xD2)

Va fi analizat pentru a imprima caracterele în clar ale fiecărei valori.

for ((n=0; n < ${#ARR[*]}; n++)); do echo -e "u${ARR[$n]//0x/}"; done

Iar ieșirea va produce câteva caractere imprimabile și câteva caractere neimprimabile, așa cum se arată aici:

Pentru convertirea valorilor hexagonale în text clar utilizând opțiunea echo comanda:

echo -e "x<hex value here>"

Și pentru conversia valorilor UTF-8 în text în clar utilizând comanda echo comanda:

echo -e "u<UTF-8 value here>"

Și apoi pentru conversia valorilor octal în text în clar folosind comanda echo comanda:

echo -e "<octal value here>"

Atunci când aveți valori de codificare cu care nu sunteți familiarizat, faceți-vă timp să verificați intervalele din schemele de codificare comune pentru a determina cărei codificări îi aparține o valoare. Apoi, conversia de acolo este foarte ușoară.

Alexander Amelkin

The echo -e trebuie să fi eșuat pentru dvs. din cauza unei scăpări greșite.Următorul cod funcționează bine pentru mine pe o ieșire similară de la your_program with arguments:

echo -e $(your_program with arguments | sed -e 's/0x(..).?/\x1/g')

Vă rugăm să rețineți totuși că șirul dvs. hexagonal original este format din caractere neimprimabile.

Cleber Nunes

Faceți un script ca acesta:

#!/bin/bash

echo $((0x$1)).$((0x$2)).$((0x$3)).$((0x$4))

Exemplu:

sh converthextoip.sh c0 a8 00 0b

Rezultat:

192.168.0.11