[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] pakke/udpakke data på bit niveau



Kim Schulz wrote:
On Sat, 29 Nov 2003 15:34:53 +0100
Egon Andersen <sslug@sslug> wrote:


Kim Schulz wrote:

hejsa
jeg har en void* som peger på et dataelement som består af:

[bit][bit][bit][int][int][int][int]


Den vil jeg gerne have lagt ind i en struktur, men er blevet lidt i tvivle om det er sikkert at gøre som jeg gør det nu. min struktur: struct type1{ unsigned int type:3; int ordrenr; int varennr; int antal; int hylde; }Type1; Type1 = (struct *type1)data; ret = Type1;


kan dette lade sig gøre eller er jeg helt galt på den?

Du skrive at du har et dataelement der består af: [bit][bit][bit][int][int][int][int] Hvordan er dette mere eksakt defineret? Hvor er der padding? Hvor meget fylder de 'int' du har i dit data-element?

Kort sagt, det er nødvendigt at kende den eksakte struktur af dit data-element og faktisk også om det er dannet af en big-endian eller little-endian maskine og om du læser strukturen ind på en big-endian eller little-endian maskine.

Når du roder med bit, skal man holde tungen lige i munden og kende en del til hvordan bittene placeres i memory!


Ja det var lidt det jeg regnede med. int er den int størrelse som int har i gcc 3.3.1, der er ingen padding. jeg laver også selv den data klump som indeholder selve strukturen (det
er en struktur magen til den som jeg vil proppe den ind i, bare på en
maskine i den anden ende af en ARCnet linje).

Vil det sige at den er den *eksakt* samme data-struktur du anvender i begge ender og arkitekturen er den samme?
Hvis du kan svare ja til begge, så har du ingen problemer med din 'proprietære protokol'.


Og lige for en god ordens skyld spurgte jeg ikke om der var padding, men hvor!
Jeg vil antage at du arbejder med little-endian (Intel family) og at du har 29 padding bits efter dine første tre bit.


Hvis du nu skal bruge bit-værdierne som bolske værdier, så ville jeg nok anvende en struktur ala:

#include <stdbool.h>
struct type 1{
  _Bool bit1:1;
  _Bool bit2:1;
  _Bool bit3:1;
  /* Her kommer 32 - 3 = 29 padding bits ;-) */
  int ordrenr;
  ...etc...
  }

Hvis du skal overføre data mellem heterogene systemer, så kræver det som nævnt en hel del mere!

Med venlig hilsen
Egon Andersen



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:10 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *