Avatar billede iceyblue Nybegynder
15. september 2004 - 14:14 Der er 22 kommentarer

C og C#

Hejsa...

Jeg skal til at lave et program som skal køre i windows, som modtager data over et serialt RS232 kabel.
Den maskine som sender data er ikke en normal pc, men nærmere en microcontroller...

Dataen ligger gemt og sendes som C datastrukturer...rettere i C struct...

Mit spg. er nu...Er det ligetil at modtage denne type af data i .Net/C#...??

Jeg har programmeret struct før i C# men ved ikke helt om det vil fungere bare uden videre?

Håber MEGET i kan hjælpe mig på vej !?

Mvh. IceyBlue
Avatar billede arne_v Ekspert
15. september 2004 - 14:17 #1
Hvis du har en præcis beskrivelse af den C struct, så burde det ikke være
så svært at læse og fortolke de data.
Avatar billede iceyblue Nybegynder
15. september 2004 - 14:24 #2
det har jeg fx.

struct INDR
{ unsigned int hcd;
  unsigned long int srn;
  unsigned lomg int mfc;
  unsigned char fl1[FILL]
  unsigned int mct;
  unsigned int mpt;
  unsigned char fL2[FIL2L]
  unsigned RSDT mdt [RSDAL];
  unsigned char fl3[FIL3L]
  unsigned int edc;
};

Hvad kræver det?
Hvad betyder det i []?
Avatar billede arne_v Ekspert
15. september 2004 - 14:27 #3
unsigned char fl1[FILL]

betyder et array af unsigned char med FILL antal elementer
Avatar billede arne_v Ekspert
15. september 2004 - 14:31 #4
Opgaven kan løses på mange måder.

Men jeg tror at det nemmeste vil være at:
  - wrappe en BinaryReader omkring den stream du nu har
  - bruge ReadByte/ReadUInt16/ReadUInt32 til at læse de enkelte værdier
  - lave en helt normal C# struct/class
  - putte de læste værdier eind i den
Avatar billede arne_v Ekspert
15. september 2004 - 14:33 #5
Du skal:
1) have fundet værdierne af de konstanter FILL etc.
2) have checket hvor mange bytes int og long er (formentlig 2 og 4)
3) have undersøgt om int og long kommer som little endian eller som big endian
4) have checket om structen er packed eller alligned
Avatar billede iceyblue Nybegynder
15. september 2004 - 15:03 #6
3) Hvordan tilpasser jeg mit program/kode således at det tolker div. bytes korrekt i forbindelse med "Little/Big Endian"?

4) Hvad er forskellen?
Avatar billede arne_v Ekspert
15. september 2004 - 15:14 #7
Hvis det er big endian så skal du have swappet bytene. Det er en ret triviel
operation.

----

struct X
{
  char c;
  int i;
}

packed = 1 byte med c + 2 byte med i / 1 byte med c + 4 byte med i
aligned = 1 byte med c + 1 byte fill + 2 byte med i / 1 byte med c + 3 byte fill + 4 byte med i
Avatar billede iceyblue Nybegynder
15. september 2004 - 15:21 #8
1. Hvordan skal jeg forstå den struct du har skrevet? Jeg mener hvordan skal bytene swappes?

2. Hvordan ser jeg om structen er packed/alinged? hvad er den struct jeg gav et eksempel på fx? Og hvad betyder det rent teknisk?
Avatar billede arne_v Ekspert
15. september 2004 - 15:27 #9
struct'en er til packed/aligned

man kan and, shift og or den byte swap (hvis ikke .NET har noget til det)

----

Det skal fremgå af docs af struct.

jeg er 99.999% sikker på at den er packed da fl1, fl2 og fl3 ligner
eksplicitte fillere
Avatar billede iceyblue Nybegynder
15. september 2004 - 15:40 #10
hhmm....altså alt det der med packed/aligned har noget at gøre med den benyttede opbygning structen benytter...således at man kan swappe div. bytes korrekt i forbindelse med Little/Big Indian...eller har jeg ikke forstår det rigtigt?
Avatar billede arne_v Ekspert
15. september 2004 - 15:42 #11
Nej - de 2 ting har intet med hinanden at gøre
Avatar billede arne_v Ekspert
15. september 2004 - 15:43 #12
Eksempel på swap af short:

short v = 1234;
short vswap = (short)(((v & 0xFF) << 8) | ((v >> 8) & 0xFF));
Avatar billede iceyblue Nybegynder
15. september 2004 - 15:51 #13
Jeg ved at Big/little indian er sammensætningen/rækkefølgen på div. bytes (Plejer at blive afbilledet i et skema i bøger og lign. bytes 1 - 15)

Men hvad packed/aligned helt præsist er, forstår jeg ikke helt? du rykker div. bytes 8 en gang til venstre eller højre...?

jeg troede at du swappede div. bytes for at konvertere fra little endian til big endian?
Avatar billede arne_v Ekspert
15. september 2004 - 15:54 #14
den swap relaterer sig til big/little endian ikke til packed/aligned
Avatar billede arne_v Ekspert
15. september 2004 - 15:55 #15
over ---- => big/little endian
under ---- => packed/aligned
Avatar billede arne_v Ekspert
15. september 2004 - 15:56 #16
en short med værdi 1 er 0x01 0x00 i little endian og 0x00 0x01 i big endian

----

se eksempel 15:14:10 (under den stiplede linie) for packed / aligned
Avatar billede iceyblue Nybegynder
15. september 2004 - 15:58 #17
hhmm...hvad mener du med over/under ---- ? sorry jeg er newbie indefor lige dette område :)
Avatar billede arne_v Ekspert
15. september 2004 - 16:04 #18
det har intet med C# at gøre.

I flere af mine kommentarer har jeg lavet en vandret stiplet linie ----.

Kommentaren ovenfor går på big/little endian spørgsmålet.

Kommentaren nedenunder går på packed/aligned spørgsmålet.
Avatar billede iceyblue Nybegynder
15. september 2004 - 16:06 #19
hehe...ok har fattet dit system med ---- ;) stupid me....

Men dit fine eksempel (15:14:10)  har jeg ikke helt gennemskuet, andet end jeg kan forstår at sammensætningen div. bytes er forskellige...men hvad er det reelt et eksempel af? Hvordan skal jeg bruge det?
Avatar billede arne_v Ekspert
15. september 2004 - 16:15 #20
Jeg ved ikke om du skal bruge det.

Det forklarer hvordan en struct X bliver gemt packed og aligned. Jeg lavede det
fordi du spurgte om hvad det betød.

Jeg er som sagt ret sikker på at din struct er packed.
Avatar billede arne_v Ekspert
27. september 2004 - 00:00 #21
OK ?
Avatar billede arne_v Ekspert
03. oktober 2004 - 15:39 #22
??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester