Sunday 25 February 2018

0x31 binary options


BasE91 codificação introdução basE91 é um método avançado para codificar dados binários como caracteres ASCII. É semelhante a UUencode ou base64, mas é mais eficiente. A sobrecarga produzida pelo basE91 depende dos dados de entrada. Ele é no máximo de 23 (versus 33 para base64) e pode variar até 14, o que normalmente ocorre em blocos de 0 bytes. Isso torna o basE91 muito útil para transferir arquivos maiores em conexões binárias inseguras como e-mail ou linhas de terminal. Alfabeto Como o nome sugere, basE91 precisa de 91 caracteres para representar os dados binários codificados em ASCII. Dos 94 caracteres ASCII imprimíveis (0x21-0x7E), os três seguintes foram omitidos para construir o alfabeto basE91: A tabela de tradução é composta dos restantes caracteres como mostrado abaixo. Esta é uma tarefa de casa onde eu tenho que converter hex para Binário quando um comando é chamado no terminal. Meu professor não está realmente ensinando C então estou perdido. Eu tenho que incluir um procedimento, void printBits (unsigned long i), que imprime os bits em i. Ele será invocado a partir da linha de comando usando a opção - p seguida por um inteiro longo não assinado de 32 bits em forma hexadecimal. EX: lab3 - p 0x5 Saída: 0000 0000 0000 0000 0000 0000 0000 0101 Por favor, não me dê apenas o código. Preciso entender isso. Aqui está uma dica, veja as seguintes funções na biblioteca C: putchar (), strcmp (), sscanf (). Estes permitirão que você resolva todos os problemas que o quotteacherquot ajustou para você. Finalmente, para lidar com argumentos de linha de comando você precisa usar os parâmetros quotargcquot e quotargvquot em sua função main (), estes são amplamente utilizados e podem ser pesquisados ​​no Google para facilmente. Ndash Wossname Feb 19 em 8:24 Há uma série de maneiras de abordagem imprimir a representação binária para qualquer número. Primeiro, você pode simplesmente produzir o resultado de seu turno e operação de índice diretamente (para stdout. Um arquivo, etc.) Esta parece ser a abordagem que você começou com, mas então você declarou um buffer de 32 bits. Enquanto você pode certamente fazer isso, não há necessidade de buffer os resultados se você não está indo para retornar um ponteiro para o buffer completo. (Que me leva ao meu terceiro ponto, abaixo) Simplesmente a saída de bits sem armazenar / retornar um ponteiro para os bits em uma Cadeia de caracteres nul-terminated, tem seu lugar, mas é geralmente de uso limitado. No entanto, é um problema comum que engloba os fundamentos de todas as abordagens. A criação de uma representação binária unpadded pode ser abordada da seguinte forma: Os comentários são bastante explicativos. O esquema é deslocar cada bit começando pelo bit mais significativo (por exemplo, bit 31 (31-0) para um número de 32 bits. Você verificar se há 1-bits após a mudança (se não, o deslocamento excede o mais Posição de bit significativo no número e nada precisa ser impresso.) Uma vez que há um pouco encontrado em rem, sempre haverá bits bits para imprimir durante o resto das iterações loop porque você está mudando por uma quantidade decrescente. O bit mais significativo (que imprime primeiro), você termina com os bits impressos na ordem correta e apenas a impressão do número de bits que compõem o número Geralmente, quando você está simplesmente enviando a representação binária diretamente para a tela, você Apenas deseja produzir bits até o bit mais significativo (o que impede a saída de um 1 com 63 0 s na frente dele fazendo uma bagunça fora das coisas.) Em seguida, é a saída de uma representação binária acolchoada para alguns número de bits. Útil se você quiser apenas olhar para os 8, 16, 32. bits inferiores em qualquer número, mas quer uma representação com um número fixo de bits de cada vez. Aqui você simplesmente passa o número de bits que você deseja olhar. Sua função será então loop sobre esse número de bit-posições em seu número e saída os resultados: Você vai notar a diferença principal aqui é que você não tem que se preocupar com verificar se os bits permanecem para evitar a impressão de zeros indesejados à esquerda, porque você Estão controlando o número de bits com o parâmetro sz. (É até você o que você faz se um tamanho 0 é passado, eu só escolher a saída 0) Agora para o terceiro ponto mencionado acima. Simplesmente a saída de bits é complicada de um ponto de vista de formatação de volta no corpo principal do seu código. Acho muito mais útil armazenar os bits em uma matriz de caracteres (nul-terminated para que ele possa ser tratado como uma string) e retornar um ponteiro para a matriz para que ele possa ser passado para printf. Etc. Agora você tem que passar uma matriz de tamanho adequado como um parâmetro, declarar uma matriz estática para que a matriz não seja destruída no retorno da função ou dinamicamente alocar o armazenamento para a matriz dentro da função. Todos têm vantagens e desvantagens que você tem que pesar dependendo das necessidades de seu código. Por exemplo: O código funciona do mesmo modo que a sua contraparte acolchoada não tamponada acima. Observe como p retorna a posição inicial dentro do buffer onde sz número de bits começa. Observe também que você precisará de uma constante para BITSPERLONG denotando o número de bits em um longo em seu hardware. (Que normalmente é manipulado de forma semelhante a BUILD64) nota: apenas estar ciente de que uma limitação a uma declaração estática é a função de conversão só pode ser usado uma vez em qualquer uma chamada printf (ou dentro de qualquer linha de código) uma vez que não há Apenas uma matriz de armazenamento para a conversão binária. (Você sempre pode fazer qualquer número de chamadas e armazenar os resultados em locais diferentes antes de fazer a chamada printf) Uma variação final na impressão binária é a impressão da representação com separadores incluídos para facilitar a identificação e comparação entre seqüências binárias (Especialmente ao lidar com sequências mais longas de 0 s e 1 seg: A função funciona basicamente da mesma forma que o binpad acima, mas com a adição de que o buffer estático é maior para acomodar os separadores e uma verificação adicional na posição do bit para determinar quando um Separador deve ser adicionado ao buffer: O restante do problema é simplesmente processar os argumentos da linha de comando e executar a conversão de uma string de entrada para um valor não assinado juntamente com a validação verifica se o número não excede 32 bits, etc. Pode processar os argumentos com getops ou para um pequeno número de opções simples, você pode simplesmente usar um loop. Em Linux, os únicos argumentos necessários o seu código deve responder a são - h para ajudar e - v para a versão. Enquanto ninguém faz isso para exemplos curtos, etc, é pelo menos agradável ter essa informação. Examine o seguinte exemplo que coloca todas as peças em conjunto e deixe-me saber se você tiver alguma dúvida: Primeiro você converter a seqüência de caracteres que você começa a partir da linha de comando para um inteiro, o mais simples é usar sscanf agora você tem o valor decimal n. Para converter em binário você precisa passar por cada bit no inteiro sem sinal. Fazendo bitwise - e com o valor decimal você pode verificar cada bit individual se é ajustado e imprime um 1 ou 0 dependendo do bitBinary e dados de texto arent separados: São simplesmente dados. Depende da interpretação que os torna um ou outro. Se você abrir dados binários (como um arquivo de imagem) em um editor de texto, muito do que não vai fazer sentido, porque não se encaixa a sua interpretação escolhida (como texto). O que você chama de texto é um subconjunto do conteúdo do arquivo possível: Dados que em um determinado conjunto de caracteres se traduzem em caracteres legíveis. Por exemplo, em ASCII. Você pode ver que, de 128 valores permitidos, apenas cerca de metade são letras e números, 30 são pontuação, eo resto são caracteres de controle. O último grupo não é usado muito em arquivos de texto, e eles não têm realmente boa representação textual. Alguns deles são caracteres Tab e Newline, onde os editores de texto já precisam ser criativos para exibi-los. Alguns editores de texto têm opções para exibir explicitamente espaço em branco. Em seguida, eles serão realmente desenhados como caracteres, além de seu comportamento de formatação regular (que também é apenas a interpretação desses caracteres). O ASCII puro interpreta apenas 128 valores. Os bytes usados ​​para armazenar essas informações têm 256 valores possíveis cada, assim metade dos possíveis valores não são permitidos em ASCII. Estes são e. Usado em conjuntos de caracteres específicos da região, como Latin 1, mas em ASCII, eles são indefinidos. Eles não têm representação útil em um visualizador de texto que só pode manipular ASCII. Dados binários normalmente não são interpretados como texto. Portanto, nesses arquivos, todos os valores de bytes possíveis são comumente encontrados. Tudo o resto seria um desperdício (e isso é uma razão que você pode comprimir o texto muito bem). Formatos de arquivos de imagem são complicados, e você geralmente não vê-los como texto, para que eles não precisam ser legíveis. Como não há interpretação comum de dados (conjunto de caracteres) que mapeia todos os valores possíveis para caracteres legíveis, e uma vez que wouldnt fazer muito sentido de qualquer maneira (como seu texto não legível), as principais partes são exibidas como jargão. Um editor hexadecimal escolhe uma representação diferente para os dados: Exibe cada byte como dois dígitos hexadecimais. É apenas uma representação diferente e uma com um conjunto de caracteres facilmente legível: Todos os 256 valores de bytes possíveis podem ser representados como dois dígitos hexadecimais. Uma vez que há um mapeamento fácil de dados binários para hexadecimal e vice-versa (4 dígitos binários para / de um dígito hexadecimal), e binário contém muito pouca informação por dígito, hexadecimal é geralmente a maneira preferida para seres humanos para ler binário, a menos que haja específicos Razões para preferir uma representação diferente. Alguns editores de texto podem ter um modo de editor hexadecimal e alguma heurística que tentou determinar se um arquivo é texto ou binário e selecionar automaticamente um modo ou outro. Mas isso pode ser difícil de obter direito e não é uma propriedade específica do arquivo que diz se o seu um ou outro tipo. Alguns clientes FTP pedem que você especifique quais terminais de arquivo são usados ​​para dados de texto. Esses programas mudarão o conteúdo do arquivo para corresponder ao sistema operacional da máquina com a qual você está conectado, já que o Windows usa uma seqüência de caracteres de linha (CR / LF) diferente da Linux e Unix (incluindo o Mac OS X LF). Tem tudo a ver com contexto e interpretação. O que há em seu computador são padrões de alta e baixa tensão, ou regiões magnetizadas de um disco, que só ganham significado quando decidimos como queremos interpretá-las. Sob diferentes circunstâncias, o padrão baixo-alto-baixo-baixo-baixo-baixo-baixo-alto pode significar o número 65, uma letra maiúscula A, uma cor azul celeste, que um cliente pediu café, a data de 6 de março ou qualquer coisa Em tudo, realmente. Quando você abre o arquivo de imagem em um programa gráfico, ele sabe interpretá-lo como uma imagem, sabe quais padrões indicam o formato da imagem, quais padrões indicam o tamanho da imagem e assim por diante. Quando você abre o arquivo de imagem em um editor de texto, ele é tratado como texto. Este é um formato muito simples, muito mais perto do que realmente está acontecendo no computador, mas ainda há alguma interpretação acontecendo. Especificamente, quase todos os padrões são interpretados como um caractere particular, alguns normais como A-Z, mas também alguns personagens estranhos. Alguns padrões não aparecem como caracteres, mas em vez disso são tratados como formatação básica: newline, guia. (A situação é ligeiramente complicada por coisas como Unicode e codificações de texto, como UTF-8, mas eu não vou lidar com aqueles aqui por uma questão de simplicidade.) Quando você tem um arquivo binário aberto em um editor de texto, tome cuidado para não fazer Mudanças, porque quase qualquer mudança que você fizer irá perturbar completamente a interpretação normal do conteúdo dos arquivos, que é que vai estragar o arquivo e torná-lo inutilizável. Como um exemplo simplificado, considere um arquivo de imagem aberto com um editor de texto. A imagem é um padrão de xadrez simples, com os quadrados 3 pixels de largura e um 1-pixel cinza fronteira entre cada quadrado. - três pixels pretos, um pixel de borda cinza, três pixels brancos, um pixel de borda cinza, repetir. A primeira linha dessa imagem teria o seguinte valor quatro vezes: (Em Hex, em vez de binário - a cadeia em binário seria quatro vezes mais longa - 0x7F sendo substituído com 0b01111111) Se você carregar essa seqüência de dados em um editor de texto , Você obteria o seguinte texto: Isto é porque 0x00 é o código ASCII para o valor Nulo e você precisa escrever que 3 vezes para obter o valor de um pixel preto (em 24 bits BMP de qualquer maneira) e você tem 3 pixels pretos. Então 0x7F é o código ASCII para Apagar, e você precisa QUE três vezes para obter um pixel cinza. 0xFF isnt valud código ASCII para qualquer coisa em particular - mesmo no conjunto ASCII estendido - e você precisa escrever 9 vezes para obter 3 pixels brancos. Terminando-o, você obtém mais três Deletes para escrever um pixel cinza. Uma maneira diferente de mostrá-lo, o que pode ser mais útil explicativo, é o exemplo inverso - o que você tem que escrever em um arquivo para obter zeros e uns quando aberto em um editor de texto Os códigos ASCII para zero e um, de Curso Um zero em um editor de texto não é armazenado como um único bit com valor 0, ele é armazenado como 8 bits com valor 0b00110000, ou em hex 0x30 O código ASCII para 0 é 0x30 eo código ASCII para 1 é 0x31, Você quer armazenar um padrão de xadrez como zeros e uns, o arquivo ficará assim: Há muito mais do que isso - os arquivos têm arranques e paradas e metadados e todos os outros tipos de coisas, mas a lição takehome e resposta para Sua pergunta é: a menos que os primeiros 8 bits do seu arquivo são 0b00110000, o editor de texto não vai escrever 0 porque thats o código ASCII para o caractere 0. A menos que os primeiros 8 bits ouf seu arquivo são 0b00110001, o editor de texto não vai escrever 1 porque esse é o código ASCII para o caractere 1.

No comments:

Post a Comment