Estou no Mac OS X 10.8.2, executando uma cópia compilada da xxd
v1.10 ( código fonte ), bem como a cópia xxd
que vem pré-instalada no OS X.
Estou tentando gerar uma assinatura SHA1 codificada em Base64 por meio de uma cadeia de comandos canalizados no Terminal.
Normalmente, eu faria algo como o seguinte:
$ echo "foo" | openssl sha1 | xxd -p -r | base64 - > foo_sha1_signature
O arquivo foo_sha1_signature
normalmente contém um hash SHA1 codificado em Base64 da sequência foo
.
O problema é que xxd -p -r
não retorna nenhum dado, portanto o arquivo foo_sha1_signature
está vazio.
Se eu dividir os comandos para analisar a saída xxd -r
, obterá um resultado (conforme impresso abaixo):
$ echo "foo" | openssl sha1 | xxd -p | xxd -r
7b36c94bcdf32bee$
Mas se eu canalizar a saída padrão para um arquivo, o arquivo estará vazio:
$ echo "foo" | openssl sha1 | xxd -p | xxd -r > foo_sha1_bytes
$ ls -al foo_sha1_bytes
-rw-r--r-- 1 alexpreynolds staff 0 Jan 2 23:02 foo_sha1_bytes
Se eu tentar o erro padrão de canalização, a saída padrão mostrará os bytes e o arquivo ainda está vazio:
$ echo "foo" | openssl sha1 | xxd -p | xxd -r 2> foo_sha1_bytes
7b36c94bcdf32bee$
Finalmente, se eu fizer tudo isso no Linux, xxd
funcionará conforme o esperado (recebo a assinatura em um arquivo). Portanto, isso parece ser um erro de como xxd
funciona no OS X 10.8.2.
Existe uma alternativa de código aberto para a xxd
qual funciona no Mac OS X e envia uma representação em bytes da entrada padrão para a saída padrão?
fonte
$'foo\n'
.) Openssl, xxd e base64 são versões pré-instaladas.xxd -p | xxd -r
não funciona e não deve ser esperado (e não é o mesmo quexxd -p -r
).xxd -p
faz um despejo hexadecimal de texto simples (neste caso, de algo que já é um despejo hexadecimal de texto simples);xxd -r
tenta fazer uma conversão reversa (hex -> binária), mas espera um despejo formatado (não texto simples) como entrada e ficará confuso ao receber um despejo de texto simples.xxd
nem a que eu compilei.xxd -p
funciona, masxxd -p -r
fornece uma string em branco. Existe uma alternativa paraxxd
que funcione da mesma maneiraxxd -p -r
?Respostas:
Você deveria tentar
Ele exibirá o arquivo no modo binário.
fonte