Acessando bits e bytes

Programação C em geral

Moderadores: 51, guest2003

Acessando bits e bytes

Mensagempor xultz » 10 Jul 2013 16:07

Seguinte: eu tenho uma situação que tenho vários bits e campos de bits.

Eu consigo fazer o que quero com um array e manipular bits com and's e or's, numa boa. Mas eu queria fazer de um jeito menos bruto.

Suponha que tenho 4 bytes, que vou chamar de cabec, origem, destino, param. Eu preciso passar esses 4 bytes prá uma rotina, e outra rotina vai me retornar esses bytes. Assim, eu acho que seria uma boa criar uma struct com estes 4 bytes. Porém, eu preciso manipular campos de bit desses bytes, por exemplo, da seguinte forma:
cabec: bits 7 a 4 - 0
bit 3 - estado
bit 2 a 0 - valor

origem: bits 7 a 4 - parte alta
bits 3 a 0 - parte baixa

Até aí tudo bem. Eu poderia fazer algo do tipo

Código: Selecionar todos
struct _bleh_
{
   struct
   {
      unsigned char z:4;      // zeros
      unsigned char estado:1;
      unsigned char valor:3;
   } cabec;
   
   struct
   {
      unsigned char alta:4;
      unsigned char baixa:4;
   } origem;
   
   unsigned char destino;
   unsigned char param;
} teste;


Eu poderia acessar o campo valor de cabec com
teste.cabec.valor = 5;

O problema é o seguinte: eu tenho outra rotina que vai receber esta estrutura, mas ao invés de acessar valor e estado de cabec, vai querer pegar o byte inteiro de cabec e guardar dentro de uma memória flash.
O que que queria saber é se tem algum jeito de fazer isso, sem pegar o ponteiro de teste e achar dentro dele o byte cabec, porque se for prá fazer isso, eu faço um array de byte e acesso tudo por ponteiro.

Alguém tem alguma ideia brilhante?
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Acessando bits e bytes

Mensagempor Red Neck Guy » 10 Jul 2013 16:59

Código: Selecionar todos

typedef struct{
  unsigned char primeiros:4;
  unsigned char segundos:5;
  unsigned char outros:6;
}campoBits;

typedef union{
  unsigned char bytes[3];
  campoBits campo;
}unionMassa;


Aí só depende do alinhamento e colocar uns espaços em branco no meio.


}
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: Acessando bits e bytes

Mensagempor xultz » 10 Jul 2013 17:06

Legal essa ideia, vou experimentar amanhã, valeu!
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x