LINUX.ORG.RU

Перевести hex во что-то человеческое

 ,


0

2

Доброго времени суток, есть некий HEX вида:

C1 E0 F2 E0 E3 E0 E9 2D C0 EB FB F2 E0 20 28 D1 E0 EA EA FB F0 FB F0 29 20 D2 C8 D1

Единственный способ перевести его в читаемый текст, который я нашел выглядет так:

echo "=C1=E0=F2=E0=E3=E0=E9=2D=C0=EB=FB=F2=E0=20=28=D1=E0=EA=EA=FB=F0=FB=F0=29=20=D2=C8=D1" | qprint -d | iconv -f cp1251 -t utf-8

А есть ли способ, без замены в исходном HEX пробелов на «=»?

★★

$ echo 'C1 E0 F2 E0 E3 E0 E9 2D C0 EB FB F2 E0 20 28 D1 E0 EA EA FB F0 FB F0 29 20 D2 C8 D1' |xxd -r |iconv -f cp1251
атагай-Алыта (Са

xxd идёт с vim

anonymous
()
echo '4a757374696e204269656265720a' | xxd -r -p

or

xxd -r -p /tmp/hex > /tmp/ascii

invokercd ★★★★
()
Ответ на: комментарий от nixit

не обрезает, нужен как ниже написали параметр -p, а мне лень смотреть в ман было

anonymous
()

И на сях:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int c, char **v){
	if(c < 2) return 1;
	int i;
	char *ptr;
	for(i = 1; i < c; i++){
		ptr = v[i];
		while(ptr){
			unsigned int out;
			char B[5];
			snprintf(B, 5, "0x%s", ptr);
			sscanf(B, "%x", &out);
			printf("%c", out);
			ptr = strchr(ptr, ' ');
			if(ptr) ptr++;
		}
		printf("\n");
	}
	return 0;
}

./a.out "C1 E0 F2 E0 E3 E0 E9 2D C0 EB FB F2 E0 20 28 D1 E0 EA EA FB F0 FB F0 29 20 D2 C8 D1"|enconv
Батагай-Алыта (Саккырыр) ТИС
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от nixit

$HEX это что за переменная?

есть некий HEX вида:

anonymous
()

И на баше:

cat convstr 
#!/bin/bash

function conv2str(){
	echo $*| sed 's/ /\n/g' | while read S; do
		echo -en "\x$S"
	done
	echo
}

conv2str $* | enconv

./convstr "C1 E0 F2 E0 E3 E0 E9 2D C0 EB FB F2 E0 20 28 D1 E0 EA EA FB F0 FB F0 29 20 D2 C8 D1"
Батагай-Алыта (Саккырыр) ТИС
Eddy_Em ☆☆☆☆☆
()

Ставишь wxHexEditor, далее Ctrl+C и Ctrl+V

kravich ★★★★
()
Ответ на: комментарий от anonymous

тебе nih синдром нарушил восприятие реальности

В конечном счете, личное удобство одерживает верх над идеализмом - может, ему просто удобнее бысто написать на привычных сях? А подойдет ли это решение вопрошающему - ему решать.

kravich ★★★★
()
Ответ на: комментарий от Eddy_Em

поттерингу тоже удобнее своё на сях накатать

anonymous
()
Ответ на: комментарий от kravich

Мне на сях удобней и привычней. Кому нравится баш — я тоже вариант предоставил.

А аноним, похоже, кроме баша ничего не признает.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

удобнее было предоставить один вариант, не прикидывайся шлангом

anonymous
()
Ответ на: комментарий от Eddy_Em

А аноним, похоже, в целях троллинга, кроме баша ничего не признает.

fix

kravich ★★★★
()
Ответ на: комментарий от Eddy_Em

ты же не понимаешь под велосипедом натуральный обычный велосипед?

anonymous
()
Ответ на: комментарий от anonymous

perl (pack) тоже должен быть кратким.. Перл чуть знаю (разве вместо awk иногда использовать), скорее всего будет покороче, чем: ruby -e 'puts $<.read.split.map{|x| Integer(x,16)}.pack("c*")'.

anonymous
()
Ответ на: комментарий от anonymous

Опоздавшие участники специальной олимпиады:

Как и ожидалось: perl -lape '$_ = pack "c*", map(hex,@F)'. (однако преемник подхватил костыли и оказался тоже коротким) ruby -ape '$_ = $F.map(&:hex).pack("c*")' (кривой руби здесь при -l делает почему вместо chomp - chop).

anonymous
()
Ответ на: комментарий от Eddy_Em

Спасибо. Думаю, это подойдёт.

nixit ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.