Jump to content

Receber char e escrever bit


Recommended Posts

Posted (edited)

Basicamente tem que ver com compressão. Queremos codificar um ficheiro de texto "0"s e "1"s. Até aí tudo bem.

Posteriormente, esse ficheiro de char's com "0"s e "1"s deve ser reescrito para os "0"s e "1"s serem efetivamente bits 0 e 1.

Quanto a dúvida... é sobre como fazer isso.

Edited by Leminski
Posted

Não sei se percebi bem qual é o objectivo... Deixa cá ver se percebi. Tens um ficheiro com carateres '0' e '1' e queres ler esses caracteres e converter para valores numéricos 0 e 1 e voltar a escrever no ficheiro??? Se é isto, acho que nem faz muito sentido, ou então não percebi o objectivo!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted

Leminski,

Consegues exemplificar o que estás a tentar fazer? A tua explicação não foi particularmente clara. Nós já compreendemos o que parece ser pretendido que faças, mas será que tu compreendeste?

Coloca aqui um exemplo de input para o teu programa e do output que esperas dele. E logicamente, clarifica melhor o que fizeste até agora e em que parte tens dúvidas, caso contrário não irás obter grande ajuda.

Posted (edited)

tipo(int,char ou bool) byte[8];
char c = carater;

for (unsigned int i = 0; i < 8; ++i) {
 byte[i] = (c >> i) & 1;
}

a ideia parece estar correcta mas a implementação é que falha

vamos ver se o criador do tópico chega lá

não num tópico da seção de C, e não C++

---

ps : tenho a solução para este problema feito no ideone (completo e a correr) em 9 linhas, com esta informação é possível ver que não é nada de mais

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted
Em 20/06/2016 às 00:28, Leminski disse:

Se percebi este código lê um char tipo "f" e escreve cada um dos bits do caracter num array de char's de tamanho 8, não é?

byte[i] = (c >> i) & 1

Não... Imagina que o carater c representa o seguinte conjunto de bits: 00001101

No primeiro ciclo do for loop, o i é 0 (obtendo assim os bits do carater 'c' apartir de i (0) bits que é "00001011) e faz o bit mask (AND) com o 1: ("00000001") e por isso vai retornar 000000001, Ou seja 1.

No segundo o i já é 1 e por isso obtêm os carateres apartir de 1 bits ou seja 00000110 e quando faz bit mask com o 00000001 retorna-te 0 (00000000)

Após ter saido do loop for de 8 ciclos ficas com um array de numeros 0 e 1 o que não corresponde a um array de carateres '1' e '0' (vê a tabela ASCII)

Tens de fazer a conversão á parte...

Posted
Em 20/06/2016 às 00:54, seuqram disse:

byte[i] = (c >> i) & 1

Não... Imagina que o carater c representa o seguinte conjunto de bits: 00001101

No primeiro ciclo do for loop, o i é 0 (obtendo assim os bits do carater 'c' apartir de i (0) bits que é "00001011) e faz o bit mask (AND) com o 1: ("00000001") e por isso vai retornar 000000001, Ou seja 1.

No segundo o i já é 1 e por isso obtêm os carateres apartir de 1 bits ou seja 00000110 e quando faz bit mask com o 00000001 retorna-te 0 (00000000)

Após ter saido do loop for de 8 ciclos ficas com um arraz de numeros 0 ou 1 o que não corresponde ao carater '1' ou '0' (vê a tabela ASCII)

Podes faz a conversão depois á parte...

Não sei se o que está a vermelho é intencional ou seria o byte que está a verde? É importante perceber para não escapar nada. Foi engano ou é intencional?

E outra mas esta acho que é óbvia... arraz = array, certo?

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted

Após ter saido do loop for de 8 ciclos ficas com um arraz de numeros 0 ou 1 o que não corresponde ao carater '1' ou '0' (vê a tabela ASCII)

Podes faz a conversão depois á parte...

pois ... mas olha bem para a primeira entrada do tópico ... o que ele quer é o inverso

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

pois ... mas olha bem para a primeira entrada do tópico ... o que ele quer é o inverso

O que eu percebi foi:

Input de chars: 0 1 0 1 1 1

//Questão: Não sei converter os 8 bits de um char para um array de 8 chars.

Output:

00000000

00000001

00000000

00000001

00000001

00000001

Se fosse essa a questão acho, depois de ter o array de ints, convertia para um array de chars e já estava resolvido.

Edited by seuqram
Posted (edited)

Não sei se o que está a vermelho é intencional ou seria o byte que está a verde? É importante perceber para não escapar nada. Foi engano ou é intencional?

E outra mas esta acho que é óbvia... arraz = array, certo?

Não me lembro de ter posto cores... Mas sim, correspondem aos mesmos bytes do carater 'c'.

Enganei-me a escrever... Não existe a palavra arraz.

Edited by seuqram
Posted

Não me lembro de ter posto cores... Mas sim, correspondem aos mesmos bytes do carater 'c'.

Enganei-me a escrever... Não existe a palavra arraz.

Eu é que coloquei a vermelho e a verde para evidenciar... Mas ok, esclarecido então!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted

Ele tem um ficheiro texto com a representação ASCII de um binário, isto é, '0' e '1's.

Tem de passar isso para binário, e não faço ideia se escrever noutro ficheiro ou não, whatever... Depois de converter para binário o problema está feito.

O seuqram usa na resposta dele tudo o que é necessário (operações bitwise) mas a implementação não está correcta. Só precisas de fazer set de um bit por cada char lido.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.