Tomar alguma saída do xxd e transformá-lo em código de shell utilizável manualmente não é divertido, portanto, seu trabalho é automatizar o processo.
Regras
Seu envio pode ser uma função, lambda, script ou qualquer equivalente razoável deles. Você pode imprimir o resultado ou, se o seu envio for uma função / lambda, também poderá devolvê-lo.
Você programa deverá ter três argumentos, o primeiro sendo uma string contendo a saída de xxd, correu com nenhum outro do que um nome de arquivo argumentos, como este: xxd some_file
. Aqui está um exemplo de como será o primeiro argumento:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Você precisa pegar a seção do meio que contém os bytes (as 8 primeiras colunas após a :
) e transformá-la em código de shell removendo qualquer espaço em branco e colocando um \x
antes de cada byte.
Aqui está o que a saída deve ser para a entrada acima (ignorando quaisquer outros argumentos):
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Você pode assumir que o primeiro argumento sempre será uma saída xxd válida, executada sem nenhum argumento além do nome do arquivo.
Sua saída também deve ser uma sequência em que as barras invertidas são barras invertidas literais, não usadas como caracteres de escape. Então, quando digo "\ x65", não estou falando do byte 0x65 ou mesmo da letra "A". No código, seria a string "\ x65".
O segundo argumento especifica onde na saída xxd o código do shell deve iniciar e o terceiro especifica onde deve terminar. Se o terceiro argumento for -1
, ele terminará no final da saída xxd. O segundo e o terceiro argumento também sempre serão não negativos, exceto quando o terceiro for-1
Aqui estão alguns casos de teste:
Argumento 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argumento 2:, 7
Argumento 3: e
(ambas são cadeias que representam números hexadecimais)
Resultado: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
Argumento 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argumento 2:, 0
Argumento 3:2e
Resultado: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e
Argumento 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argumento 2:, a
Argumento 3:-1
Resultado: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
O código com menos bytes vence. O vencedor será anunciado em sete dias, em 15 de agosto de 2016 (mas as inscrições depois disso ainda serão apreciadas).
Atualizar
Parabéns a @Adnan por vencer o desafio!
fonte
~
vez de\x7e
. E podemos voltar em\t
vez de\x09
?7
parece um índice baseado em zero ee
é um índice baseado em um (e-7=7
mas há 8 códigos hexadecimais em sua saída), ou estou ignorando alguma coisa?Respostas:
05AB1E ,
3938 bytesEntrada no formulário:
Código:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
Bash + coreutils + xxd,
737169 bytesEspera o hexdump no STDIN e inicia / termina como argumentos da linha de comando.
Isso imprime alguns avisos ao STDERR, que é permitido por padrão.
fonte
xxd
sua solução!16#
por0x
?xxd
coisa, mas parece funcionar em todos os lugares.0xn
hexadecimal e de0m
estilo octal imediatamente : gnu.org/software/bash/manual/bash.html#Shell-Arithmetic .echo $[0x2a] $[052]
.JavaScript, 84 bytes
Explicação: Remove todas as partes indesejadas do dump, precede
\x
cada par hexadecimal e extrai a parte desejada do resultado.||u
é usado para converter o zero obtido incrementando o-1
parâmetro noundefined
qual é um valor mágico que fazslice
com que a fatia seja finalizada no final da string. 101 bytes sef
et
são cadeias de dígitos hexadecimais:fonte
(s,f,t,u)=>
, você pode fazers=>f=>t=>u=>
, salvar alguns bytes.u
deve ser um parâmetro adicional e não pode ser curry.Ruby:
9089877963 bytes-2 bytes graças a @addison
-8 bytes graças a @PiersMainwaring
Veja os testes em repl.it: https://repl.it/Cknc/5
fonte
.join
por*""
para salvar 2 bytes..map{|h|h.to_i(16)}
por.map(&:hex)
para economizar mais 8 bytes!.hex
os argumentos individualmente!Geléia ,
4844 bytesIsso espera o hexdump como único argumento da linha de comando e os pontos final e inicial no STDIN, nessa ordem, separados por um avanço de linha.
Experimente online!
fonte
PowerShell v2 +,
175157142133129 bytesToma entrada
$a
,$b
,$c
, com$a
tanto como uma corda separada por nova linha literal, ou com o PowerShell`n
carácter separando as linhas. Definimos a sequência auxiliar$z
como o altamente processado da$a
seguinte maneira:Primeiro,
-split
em novas linhas, em seguida, para cada linha|%{...}
, dividimos a seção do meio[10..48]
, usamos a-ne32
para remover espaços,-join
juntando-a novamente em uma cadeia longa,-split
em cada dois caracteres (mantendo os dois caracteres) e-ne''
para remover os elementos vazios. Isso resulta em uma matriz de cadeias de dois elementos, como('31','c0','b0'...)
.Em seguida, dividimos o array com base no
$b
elenco com o operador hexadecimal até o valor de$c
. Precisamos usar um pseudo-ternário aqui que explique se$c
é-1
ou não. Se for, escolhemos o.count
(ou seja, o elemento final) de$z
. Caso contrário, apenas adicionamos o0x
operador hexadecimal$c
em uma string. Observe que isso é indexado a zero.Essa fatia da matriz tem seus elementos
-join
editados junto com um literal\x
para formar uma sequência. Isso é anexado a outro literal\x
e o resultado é deixado no pipeline. A impressão está implícita.Exemplo
fonte
Geléia ,
393837 bytesExperimente online!
Agora supera 05AB1E! (apesar da falta de "converter de hexadecimal" embutido)
Mesmo formato de entrada que a solução de Dennis .
Use
Ɱ
, que é um novo recurso (abreviação deЀ
). Sem ele, isso levaria 38 bytes.fonte
Perl, 114 bytes
Argumentos dados na linha de comando como uma string entre aspas seguida por dois números. Os números são tirados em decimal (eu sei que hex foi usado nos exemplos, mas não foi especificado no post)
Tecnicamente, funciona apenas em entradas com até 2 ^ 21 bytes, já que o método de substring do perl é tolo
fonte
7
ae
deve resultar em uma cadeia de comprimento 32.Python, 140 bytes
https://repl.it/ClB3
Divide a string original e despeja os elementos se tiverem menos de cinco caracteres, acrescenta
\x
e fatias pelo segundo e terceiro argumentos.Versão de 162 bytes, se precisarmos lidar com outros tipos de saída não especificados pela pergunta:
fonte
00000030: 5858 58 XXX
uma vez que puxará a última parte e você obterá algo como\x58\x58\x58\xXX\xX
.xxd
saída usada como argumento. "Aqui está um exemplo de como será o primeiro argumento:"Python 2 e 3 -
164 162 150 146 134150 bytesAgora aceita cadeias hexadecimais para o segundo e o terceiro argumentos.
fonte
Python 3.5, 125 bytes
Ungolfed:
fonte