Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Leminski

Receber char e escrever bit

Mensagens Recomendadas

Leminski

Boa noite.

Tenho um projecto da universidade onde se pretende receber um ficheiro com char's (0 ou 1) e escrever bit's (0 ou 1) e não faço ideia de como tratar disto.

Sugestões?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leminski

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.

Editado por Leminski

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

dizer que a dúvida é "como fazer isso", não descreve uma dúvida.

isto porque uma resposta a uma questão dessas equivale ao enunciado, que no final não resulta em nada de produtivo.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leminski

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 é?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

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...

Editado por seuqram

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

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.

Editado por seuqram

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

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.

Editado por seuqram

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.