GNU/Linux >> Linux の 問題 >  >> Linux

16 進文字列をバイナリに変換し、netcat で送信します

-r を使用しました および -p xxd に切り替える :

$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

@Gilles の回答からのインスピレーションのおかげで、ここに perl バージョンがあります:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181

xxd なしのソリューション または perl :

echo の場合 シェルのビルトインでサポートされています (bash そして zsh するが、dash しない )、正しいバックスラッシュ エスケープを使用する必要があります:

echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181

/bin/echo の場合 GNU coreutils (Linux システムではほぼ標準) または busybox からも使用できます。

sed で エスケープされたパターンを生成できます:

$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43

組み合わせ:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181

xxd の場合 、それは簡単です:16 進数との間で変換できます。

echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

POSIX ツールのみを使用して 16 進数を 2 進数に変換する合理的な (そしてかなり高速な) 方法はないと思います。 Perl ではかなり簡単に実行できます。次のスクリプトは、16 進数以外の入力文字を無視して、16 進数を 2 進数に変換します。入力行に奇数の 16 進数が含まれている場合、エラーが発生します。

#!/usr/bin/env perl
$^W = 1;
$c = undef;
while (<>) {
    tr/0-9A-Fa-f//cd;
    if (defined $c) { warn "Consuming $c"; $_ = $c . $_; $c = undef; }
    if (length($_) & 1) { s/(.)$//; $c = $1; }
    print pack "H*", $_;
}
if (!eof) { die "$!"; }
if (defined $c) { warn "Odd number of hexadecimal digits"; }

本当に POSIX に固執する必要がある場合 (組み込みデバイスなど)、16 進数ではなく Base64 を使用することをお勧めします。 uudecode を使用して Base64 をデコードできます。入力には、uuencode によって生成されたヘッダー形式と終了行が必要です。未加工の Base64 にすることはできません。

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF

Linux
  1. LvmとDm-cryptでトリミングしますか?

  2. Ddでバイナリにパッチを適用しますか?

  3. 関数とパラメータを変数として持つシェルスクリプト?

  1. 無料の PowerISO を使用して、Linux または macOS で ISO、BIN、DAA ファイルを開き、抽出し、変換します

  2. Linux から添付ファイルと本文を含むメールを送信する方法

  3. Linux シェルで 16 進数を ASCII 文字に変換する方法は?

  1. Linux シェル スクリプト:16 進数からバイナリ文字列へ

  2. bash のテキスト文字列を配列に変換する

  3. 生のバイナリデータを指定された幅と高さの画像として表示する方法は?