16 진 문자열을 이진으로 변환하고 netcat으로 전송


45

함께 보낼 수있는 이진 파일이 있습니다 netcat.

$ nc -l localhost 8181 < my.dat

파일에는 다음이 포함됩니다.

$ xxd my.dat
0000000: 0006 3030 3030 4e43                      ..0000NC

내가 정말로하고 싶은 것은 16 진수 문자열을 직접 보내는 것입니다. 나는 이것을 시도했다 :

$ echo '0006303030304e43' | nc -l localhost 8181

그러나 위의 명령은 ascii 문자열을로 직접 보냅니다 nc.

답변:


54

내가 사용 -r-p 로 전환 xxd를 :

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

@Gilles 답변에서 영감을 얻은 펄 버전은 다음과 같습니다.

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

선행 \ x가 제거되면 Postgres의 bytea 16 진 형식에 적합합니다.
nathancahill 2016 년

감사! 매니페스트에서 Firefox 사전 다이제스트를 확인하는 데에도 효과적입니다! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio

26

xxd또는 없는 솔루션 perl:

는 IF echo쉘 지원을의 내장은 ( bashzsh수행하지만 dash), 당신은 단지 바로 백 슬래시 이스케이프를 사용해야합니다 :

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

당신이있는 경우 /bin/echo에서 GNU의로 coreutils (Linux 시스템에 거의 표준) 또는 비지 박스에서 당신도 사용할 수 있습니다.

으로 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

아주 좋은 해결책!
Chris Snow

2
echo가 확장 기능을 지원하는지 여부를 바꾸면 대치 작업 echoprintf제거됩니다. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181.
Jaakko

11

당신이 있다면 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

1

이것과 유사합니다 : https : //.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

stdin에서 다양한 변환을 수행하고 결과를 stdout으로 뱉어내는 도구를 작성했습니다. cryptocli dd이러한 변형 만 수행하고 다른 작업은 수행하지 않습니다.

echo -n 0006303030304e43 | cryptocli dd -decoders hex | nc -l localhost 8081

당신을 위해 일할 것입니다.

이 도구는 오픈 소스이므로 여기에서 찾을 수 있습니다 : https://github.com/tehmoon/cryptocli

편집하다:

내 도구를 사용하여 16 진수로 직접 인코딩 할 수도 있습니다.

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081

(1) 616263이 질문과 어떤 관련 이 있습니까? 질문의 데이터를 사용하십시오. (2) 어떻게 작동하는지 설명 할 수 있습니까? 의견에 응답하지 말고 명확하고 완전하게 답변을 수정 하십시오.
G-남자 '는 분석 재개 모니카'말한다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.