Imprime os dados binários como estão sem quebrar o terminal

0

Eu escrevi um módulo Python para despejar objetos. Ao usá-lo com objetos que contêm dados binários (por exemplo, numpy.ndarray ) em um terminal linux ( TERM=linux ), imprimir os resultados de dados na quebra de fonte do terminal - aparentemente, alguns caracteres são tratados como seqüências de controle terminais. No Windows, a impressão funciona bem, mesmo no terminal mintty do Cygwin (embora tenha TERM=xterm ).

O mesmo acontece quando eu cat um arquivo binário.

Eu posso consertar isso com reset , é claro, mas com o custo de perder a saída, e geralmente é inconveniente. Embora eu saiba que a maioria, senão todos os caracteres de controle têm representações gráficas alternativas em fontes (por exemplo, para CR , é ).

Então, existe alguma maneira de alterar o fluxo bruto para fazer com que o terminal linux trate caracteres especiais que estavam nele como literais? Basicamente, eu gostaria de ver algo assim: p>

Estou principalmente interessado em uma forma programática (= o que precisa ser feito do ponto de vista do terminal e uma implementação em bibliotecas comuns do sistema, se houver); um caminho no shell seria um plus.

O repr() do Python não atende às minhas necessidades: ele expande os caracteres ASCII não imprimíveis e as seqüências de comprimento variável, incluindo letras nacionais, enquanto a meta de design do módulo é que a impressão do dump seja concisa e legível.

    
por ivan_pozdeev 30.11.2016 / 07:21

2 respostas

3

O programa showconsolefont pode exibir 256 diferentes (ou 512 diferentes. .) glifos de uma só vez no console do Linux. Mas isso é feito usando uma chamada de sistema (que funciona apenas para conexões com o dispositivo do console). Sua página de manual não menciona isso.

Mas glifos (que são usados para exibir caracteres) não são a mesma coisa que caracteres . Você exibia um caractere imprimindo-o no terminal e o terminal mapeia isso para um glifo. Não há uma seqüência de escape que possa dizer ao console do Linux para tratar os caracteres de controle como imprimíveis.

Por exemplo, showconsolefont na verdade não escreve caracteres de controle para células 0-31. Ele mapeia caracteres imprimíveis no intervalo de 0 a 31 usando (você adivinhou) uma chamada de sistema.

Leitura adicional:

por 02.12.2016 / 17:13
0

Não tenho conhecimento de nenhuma maneira de alterar o terminal para aceitar todos os caracteres. Os caracteres de controle são um recurso do terminal, e normalmente é dever do programa prestar atenção ao tipo de terminal, produzir os caracteres de controle corretos para os recursos do terminal que ele deseja usar e escapar de qualquer controle caracteres que deseja imprimir.

Informações sobre como alterar um programa Python para fazer isso podem ser encontradas, por exemplo, em esta pergunta do stackoverflow.

No shell, você pode usar, por exemplo, tr para converter caracteres de controle em outros caracteres ASCII (embora não em caracteres unicode). Veja esta pergunta para alternativas que podem usar caracteres unicode.

O Unicode define um grupo Control Picture para exibir caracteres de controle, por exemplo, o retorno de carro é . Se nunca ouviu falar sobre representando CR, e se sim, isso é puramente acidental em alguma fonte que você usa.

E no shell, você não iria apenas cat um arquivo binário, mas usaria hexdump -C ou similar para examiná-lo.

    
por 30.11.2016 / 08:32