Página 1 de 1

Acessando bits e bytes

MensagemEnviado: 10 Jul 2013 16:07
por xultz
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?

Re: Acessando bits e bytes

MensagemEnviado: 10 Jul 2013 16:59
por Red Neck Guy
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.


}

Re: Acessando bits e bytes

MensagemEnviado: 10 Jul 2013 17:06
por xultz
Legal essa ideia, vou experimentar amanhã, valeu!