• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Tsunamy_boy

Posso ter quantos bits eu quiser num ficheiro?

50 mensagens neste tópico

Os ficheiros têm que ser gravados obrigatoriamente com bytes certos? Não podem haver meios bytes (do género 4bits)?

Melhor:

Posso criar um ficheiro com 1bit apenas?

É que ando á procura de como gravar em C# bit a bit e não encontro nada, a única hipótese que há é gravar byte a byte, mas isso não me ajuda muito...

É possível, não é possível?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa lá mas eu tenho de ser directo... Tu não achas que estas a tentar inventar a roda? Não achas que o que tu queres fazer já não foi pensado mais de mil vezes desde que existem computadores?

Eu não percebo muito do assunto mas tu também pareces não perceber e eu acho que falta é teres alguma noção de arquitectura de computadores e algo me diz que o que queres fazer não é possível devido à arquitectura do computador.

Eu acho que não estou errado apesar de não perceber quase nada do assunto, mas tenho um feeling que isso não é possível por isso recomendo-te que leias mais sobre arquitectura de computadores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na prática no minimo cada ficheiro tem o tamanho dum bloco. Os discos rigidos são dividos em clusters, e depois em blocos.

Se depois um ficheiro precisar de mais espaço, vai requisitando mais blocos.

E para esclarecer os ficheiros são guardados de bit em bit. Mas convencionou-se a leitura/escrita de 8 em 8. Mas podes ler/escrever em qualquer quantidade que queiras.

Cumprimentos

Links:

http://en.wikipedia.org/wiki/Block_(data_storage)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já deves ter lido os meu tópicos de compressão e todos foram um fracasso...ok eu admito.mas já pensei noutro e não vou falar nele até ter certeza que funciona para não cometer o mesmo erro de estar a afinar coisas erradas.mas ok.a pergunta não passava por aí.eu apenas quero saber se e possível gravarmos os bits que quisermos num ficheiro apenas isso.pois em c# não vejo código para isso.caso não exista eu arranjo maneira de acrescetar os que faltam(se essa for a única solução).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na prática no minimo cada ficheiro tem o tamanho dum bloco. Os discos rigidos são dividos em clusters, e depois em blocos.

Se depois um ficheiro precisar de mais espaço, vai requisitando mais blocos.

E para esclarecer os ficheiros são guardados de bit em bit. Mas convencionou-se a leitura/escrita de 8 em 8. Mas podes ler/escrever em qualquer quantidade que queiras.

Cumprimentos

Links:

http://en.wikipedia.org/wiki/Block_(data_storage)

obrigado.

Eu não pretendo escrever de 8em8bits vai mudando conforme a estrutura do ficheiro ou leio de 4em4 ou de 8em8 (aqui de 4em4 são comandos ou informações da compressão de dados são como declarações de algo)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Normalmente o que se faz é ler um bloco grande e depois trabalhar como quisermos, e voltar a gravar o bloco de uma vez.

E quando digo grande é mesmo grande, porque mesmo ler um byte de cada vez é um desperdício de recursos..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os sistemas de ficheiros normalmente funcionam à base de blocos, o tamanho mínimo costuma ser 4kB ou 4096 bytes.

Mas isso não invalida que possas criar ficheiros com 1 byte. Tenta criar um ficheiro .txt com um caracter, e se fores às propridades do ficheiro vais reparar que o tamanho é de 1 byte enquanto o tamanho em disco é de 4kB.

Mas se percebi o que tu queres, é nesse mesmo byte, poder utilizar os 8 bits para armazenar informação, e essa é uma técnica bastante utilizada para poupar memória.

Bitwise operations.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled não vejo onde está o problema. Uma pessoa aprende a fazer coisas que já estão feitas.

Em relação à dúvida. Acho que o pessoal não percebeu lá muito bem. Ele quer saber se pode escrever num ficheiro um número qualquer de bits.

Os blocos não são chamados ao assunto. Mesmo se um ficheiro ocupar 1 kb e o bloco for de 4 kb. Do lado do código quando se for ver o ficheiro, só irá ter 1kb de dados, não irá ter 4kb.

Agora respondendo à dúvida, eu não acho que seja possível criar um ficheiro com um número qualquer de bits. Penso que tem que ser escrito sempre byte a byte, ou seja, o número total de bits num ficheiro tem de ser múltiplo de 8. Mas não tenho a certeza e posso estar completamente errado.

A questão é: É possível criar um ficheiro só com 1 bit? (Independentemente do tamanho que o ficheiro ocupa fisicamente no disco)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora respondendo à dúvida, eu não acho que seja possível criar um ficheiro com um número qualquer de bits. Penso que tem que ser escrito sempre byte a byte, ou seja, o número total de bits num ficheiro tem de ser múltiplo de 8. Mas não tenho a certeza e posso estar completamente errado.

A questão é: É possível criar um ficheiro só com 1 bit? (Independentemente do tamanho que o ficheiro ocupa fisicamente no disco)

Sim a duvida é mesmo essa...

Normalmente o que se faz é ler um bloco grande e depois trabalhar como quisermos, e voltar a gravar o bloco de uma vez.

E quando digo grande é mesmo grande, porque mesmo ler um byte de cada vez é um desperdício de recursos..

Eu pretendo ler o ficheiro byte a byte como normalmente se faz e espalhar tudo uma caixa de texto,onde uso o meu metudo de compressão, depois tenho q guardar tudo bit a bit pois tenho declarações de várias coisas que vão ter apenas 2bts ou 4 ou 5 ou até 1(que seguem sempre a mesma estrutura), nunca 8 ao certo e o resultado não vai ser multiplo de 8 logo á partida

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

OK então respondendo directamente à tua dúvida: Podes gravar quantos bits quiseres, porque basicamente se tiveres:

01011011 1000000000000000000....

Tens 9 bits guardados, embora o sistema de ficheiros considere que são 16 (2 bytes). Sim o sistema de ficheiros apenas te permite guardar bytes (bits múltiplos de 8), mas se retirares a redundancia dos zeros no teu algoritmo consegues implementar o que pretendes.

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

OK então respondendo directamente à tua dúvida: Podes gravar quantos bits quiseres, porque basicamente se tiveres:

01011011 1000000000000000000....

Tens 9 bits guardados, embora o sistema de ficheiros considere que são 16 (2 bytes). Sim o sistema de ficheiros apenas te permite guardar bytes (bits múltiplos de 8), mas se retirares a redundancia dos zeros no teu algoritmo consegues implementar o que pretendes.

Cumprimentos

Ah!!! obrigado... agora o prob e encontrar maneira de gravar bits num ficheiro em c#, caso alguem saiba como, diga-me neste topico:

http://www.portugal-a-programar.pt/forums/topic/0-find-topic/?do=findComment&comment=181172

Cumprimentos e obrigado a todos

Já que estás a usar C# procura pela class BitArray. :thumbsup:

BitArray ja descobri cenas sobre isso mas depois é gravado em bytes...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não achas que chega de tópicos criados? Se continua neste ritmo vou ser forçado a fazer merge de uma carrada de tópicos teus.

A discussão pode perfeitamente continuar neste tópico, não há necessidade de voltar a mudar.

Não há forma de escrever bit a bit num ficheiro, mas cabe-te a ti transformar os teus conjuntos de 4/5/6/whatever bits em blocos de 8 a ser escritos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sinceramente, não percebo qual é a crise de usar não usar um byte completamente. Se precisas de usar 9 bits, usas 2 bytes, e enches o espaço que não precisas com 0:

10101010100000000

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

com o mx disse... se quiseres criar um ficheiro com um numero de bits que não seja multiplo de oito, para todos os efeitos o ficheiro vai 'ter' os restantes bits até ocupar um byte. Não sei em particular o que acontece, se os restantes bits ficam como estão, se são postos a zeros, ou 1s.

Isto porque os nossos computadores não têm capacidade de endereçamento bit a bit, só conseguem usar endereços de memória que byte a byte.

Por exemplo, mandas o processador ir ler o byte que está no endereço de memória X, esse endereço corresponde SEMPRE ao início de um byte.

Uma coisa que é importante aqui e que gostava de poder esclarecer melhor mas infelizmente n tenho conhecimento para isso, é o tamanho do fichieiro no sistema de ficheiros usado.

O sistema de ficheiros como já foi aqui dito reserva espaço byte a byte, mas tem tambem que conter informação sobre o tamanho dos ficheiros, se assim não fosse, quando abrias um ficheiro, este ia ser lido até ao final do último bloco que usa.

Eu não sei como são os cabeçalhos/tabelas dos sistemas de ficheiros.

Acho que os comprimentos dos ficheiros são sempre em bytes, tenho quase a certeza, se alguem estiver mais por dentro deste assunto, por favor confirme.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei...eu acho que o computador vai ter que ler bit a bit e não byte a byte pois 1byte e um grupo de 8bits e eu duvido que ele leia grupos de 8em8bits de cada vez,apenas o faz para interpretação de caracteres e os escrever.penso que seja assim mas também posso tar errado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os computadores fazem leituras de 32 bits até, não é 1 a 1 nem 8 a 8.

Isto é bastante simples de fazer: basta ter 32 "fios" ligados em vez de 1..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não sei como são os cabeçalhos/tabelas dos sistemas de ficheiros.

Acho que os comprimentos dos ficheiros são sempre em bytes, tenho quase a certeza, se alguem estiver mais por dentro deste assunto, por favor confirme.

A forma como o sistema de ficheiros armazena informação não tem grande relevância para este problema, o que interessa é que devolva o tamanho certo (em bytes). :biggrin:

É possível fazer um sistema de ficheiros que permita escrita bit-a-bit, mas não vejo a utilidade disso. Além disso, o sistema de ficheiros teria de utilizar bytes na mesma para armazenar a informação, porque como o pedrotuga já disse, é a forma de endereçamento do CPU.

Os computadores fazem leituras de 32 bits até, não é 1 a 1 nem 8 a 8.

Isto depende da arquitectura, mas por exemplo na Intel x86 podes ler qwords (64 bits), dwords (32 bits), words (16 bits) ou bytes (8 bits)  - p. ex. o registo EAX (32 bits) -> AX (16 bits) -> AH/AL (8 bits) .

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que estas a pensar é mais uma questão do modo como os SOs funcionam e as APIs. Penso que não há nenhum SO que tenha APIs para manipular bits como queres.Ate a arquitectura dos pcs nao permite. A possibilidade que tens e manipular 8 bits em assembly.

Acho que o que tu queres é de o mais baixo nivel que há.

nivel de assembly e não de C++

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que estas a pensar é mais uma questão do modo como os SOs funcionam e as APIs. Penso que não há nenhum SO que tenha APIs para manipular bits como queres.Ate a arquitectura dos pcs nao permite. A possibilidade que tens e manipular 8 bits em assembly.

Acho que o que tu queres é de o mais baixo nivel que há.

nivel de assembly e não de C++

Eu não quero ir para linguagens de baixo nivel, muito longe disso!

É o seguinte, eu explico a estrutura do ficheiro (depois de compactado usando o meu método de compactação de dados):

o cabeçalho fica assim:

0000 0000 000 000 000

e cada parte que vêm separada significa:

-versão do ficheiro no programa (converto para decimal estes 4bits e da-me a versão do ficheiro de 1 até 16 (excluindo a contagem apartir do zero))

-máximo de caracteres (ja nem me lembro o que isto define mas tem a ver com contagem tambem, alias acho que isto até ja desapareceu pois era desnecessário usar isto)

-Bits necessários para indicar a quantos caracteres existe naquele posição.

-Quantidade de bits para fazer a extra-compactação

-bit usados na posição virtual

...e depois vem o resto do ficheiro.

O que fiz no cabeçalho do ficheiro foi a criação de variáveis com 4 e 3 bits que vão assumir valores (em decimal) entre o 1 e o 16(no caso dos 4bits) e de 1 a 8 (no caso dos 3bits) (pois neste caso exclui o 0 para ficar com um valor a mais, visto que o zero me era desnecessário)

Como vêm actualmente tenho 17bits, e não é múltiplo de 8, a opção é adicionar o que falta, mas a ideia é reduzir o ficheiro e não aumenta-lo...

mas em ultimo caso crio mais uma variavel no cabeçalho que me vai indicar que no fim do ficheiro existem N bits que são palha.

Agora, caso exista possibilidade de guardar 17 bits(como no exemplo) em vez de 24 (17+7) para dar bytes certos, melhor.

agora estou confuso pois uns dizem que é possivel, outros dizem que não, e sobre este post:

Os sistemas de ficheiros normalmente funcionam à base de blocos, o tamanho mínimo costuma ser 4kB ou 4096 bytes.

Mas isso não invalida que possas criar ficheiros com 1 byte. Tenta criar um ficheiro .txt com um caracter, e se fores às propridades do ficheiro vais reparar que o tamanho é de 1 byte enquanto o tamanho em disco é de 4kB.

Isto acontece, o sistema operativo reduz para KB o tamanho do ficheiro.

dai este post me ter deixado a pensar que é possível.

A forma como o sistema de ficheiros armazena informação não tem grande relevância para este problema, o que interessa é que devolva o tamanho certo (em bytes). :biggrin:

Eu não quero ter o tamanho certo de Bytes como explico neste post

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazê-lo colando o teu ficheiro a esses 17 bits, vai é dar algum trabalho. Basicamente, colocas 2 bytes (16 bits) e depois o bit extra com 7 bits do ficheiro.

Mas sinceramente estar a discutir mais byte menos byte..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazê-lo colando o teu ficheiro a esses 17 bits, vai é dar algum trabalho. Basicamente, colocas 2 bytes (16 bits) e depois o bit extra com 7 bits do ficheiro.

Mas sinceramente estar a discutir mais byte menos byte..

Desculpa, não percebi, podias explicar melhor o raciocínio?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou voltar a explicar...

Podes armazenar a informação utilizando apenas bits, mas o sistema operativo guarda sempre o ficheiro utilizando bytes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então se eu gravar 2bits o sistema operativo vai gravar 1byte?é isso?

0

Partilhar esta mensagem


Link 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