Toon posts:

[C] String converten naar ascii

Pagina: 1
Acties:

Verwijderd

Topicstarter
GOeie morgen,

Ik ben bezig met een i2c programma die als master gaat dienen voor een meetkaart. Hierbij werkt alles op bit niveau, ik heb een programma gemaakt dat de ascii waarde van A omzet naar binair. (tenminste dat denk ik) ;)

als ik het uitvoer krijg ik de waarde van A als volgt:

01100001

dit is dus gewoon een array van bit[8].

Nu komt mijn probleem, ik wil het ook weer terug kunnen zetten, ik dacht das ik gewoon eeen for loop kon doen van 0 tot 8 en als er een 1 staat xor-en met 0x80 of anders met een 0, en vervolgens shiften.

echter krijg ik er wel een character uit, maar niet de gene die ik verwacht (de A dus).

hier is de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (i = 0; i <= 8; i++)
 
 {

  if (b[i] == 0)
  {   buf=0;
   buf = (a ^ 0x00);
  }
  else

  {
   buf=0;
   buf = (a ^ 0x80);
  }
  
  d = d + buf;
  a = a >> 1;
 }

note: heb natuurlijk alleen de relevante dingen gepost.

  • HansMij
  • Registratie: Mei 2002
  • Laatst online: 07-09 09:03
Waar wil je dit in terugzetten (wil je dit naar een poort sturen of gewoon op je scherm het oorspronkelijk karakter reproduceren)?

Verwijderd

Topicstarter
nou uiteindelijk de poort sturen, maar ik wil het eerst ff op m'n scherm hebben zeg maar.

  • HansMij
  • Registratie: Mei 2002
  • Laatst online: 07-09 09:03
code:
1
2
3
4
5
6
7
8
9
for (i = 0; i < 8; i++)
{
  if (b[i])
  {
    a = a + 1;
  }

  a = a << 1;
}

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

HansMij:
code:
1
2
3
4
5
6
7
8
9
10
for (i = 0; i < 8; i++)
{
if (b[i])
{
a = a + 1;
}

a = a << 1;

}
Yea right :+ Iets zegt mij dat dit wel ongeveer het meest nutteloze stukje code is wat ik ooit gezien heb :D

tenzij er wat toelichting op volgt, naturellement :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • HansMij
  • Registratie: Mei 2002
  • Laatst online: 07-09 09:03
Op dinsdag 14 mei 2002 11:39 schreef drm het volgende:

[..]

Yea right :+ Iets zegt mij dat dit wel ongeveer het meest nutteloze stukje code is wat ik ooit gezien heb :D

tenzij er wat toelichting op volgt, naturellement :)
Dan heb je het bovenste stukje code nog niet gezien

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (b[i] == 1)
        {
            buf = a+1;
        }
        

        
        d = d + buf;
        a = a >> 1;
    }

    printf ("%c\n", d);
    printf ("%s\n", b);
}

Dit werkt.. tnx!

  • HansMij
  • Registratie: Mei 2002
  • Laatst online: 07-09 09:03
Nou goed dan...
code:
1
2
3
4
5
6
7
8
9
10
11
12
//alle bitjes doorlopen
for (i = 0; i < 8; i++)
{
  //binaire code shiften
  a = a << 1;
  //Als een 1 gevonden is
  if (b[i])
  {
    //zet bit op 1
    a = a + 1;
  }
}

  • cpwins
  • Registratie: Oktober 2001
  • Laatst online: 25-07 16:54

cpwins

ut Grunn...

Allereerst raad ik je aan de volgende for-loop te gebruiken:
code:
1
for (i = 0; i < 8; i++)

want zoals jij hem had staan wordt hij 9 keer uitgevoerd i.p.v. 8 keer.
Kun je uitleggen waar de waarde "01100001" vandaan komt? In de ASCII tabel staat de 'A' namelijk als
code:
1
2
Oct   Dec   Hex   Char
101   65    41    A

Hex 41 komt volgens mij overeen met 01000001. Als je deze bitstring weer naar een ascii waarde wil omzetten, kun je dat denk ik het best als volgt doen:
- de waarden van bit[8] in een int[8] kopieren (misschien overbodig, even proberen dus)
- deze waarden aan een nieuwe int toevoegen, waarbij je i[0] 7 bits naar links schuift ( << ), i[1] 6 bits, ..., en i[7] 0 bits.

Ik hoop dat je hier wat aan hebt. :)

  • cpwins
  • Registratie: Oktober 2001
  • Laatst online: 25-07 16:54

cpwins

ut Grunn...

Oeps een beetje laat... en die oplossing hierboven is veel mooier natuurlijk. |:(

Verwijderd

Topicstarter
die for loop is idd een typo, dat met die ascii, mischien niet het juiste woord gekozen, maar het werkt nu iig. de waarde A --> binair als ik deze weer terugzet krijg ik keurig weer de A.

tnx anyway

  • HansMij
  • Registratie: Mei 2002
  • Laatst online: 07-09 09:03
Kun je uitleggen waar de waarde "01100001" vandaan komt?
Wel...

Een a levert als ASCII-waarde 97 op en als je het getal 97 omzet naar binair (bijvoorbeeld met de windows-calculator) kom je op deze code uit

Eigenlijk best simpel;)

Verwijderd

Kun je trouwens die bit array niet gelijk casten naar een char???? je bit array ("b") is ook maar een pointer...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

markvleth:
Kun je trouwens die bit array niet gelijk casten naar een char???? je bit array ("b") is ook maar een pointer...
Nee, want een bit is geen variabele. dus er valt niets te casten.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
01000001 dat heb ik als A .. (sorry) ..

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 14 mei 2002 11:47 schreef HansMij het volgende:
Nou goed dan...
code:
1
2
3
4
5
6
7
8
9
10
11
12
//alle bitjes doorlopen
for (i = 0; i < 8; i++)
{
  //binaire code shiften
  a = a << 1;
  //Als een 1 gevonden is
  if (b[i])
  {
    //zet bit op 1
    a = a + 1;
  }
}
das wel leuk, maar nu draai je de bits om (bit0 = 20 = 1)

als het bij de topicstarter werkt heeft hij de array omgedraaid :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:50
Op dinsdag 14 mei 2002 11:39 schreef drm het volgende:
Yea right :+ Iets zegt mij dat dit wel ongeveer het meest nutteloze stukje code is wat ik ooit gezien heb :D
Commentaar toevoegen aan zulke eenduidige code is echt 't meest onzinnige wat je kan doen.

Alternatief zou 't zo ook nog kunnen:
code:
1
2
  for (a=0, i=0; i<8; i++)
    a |= b[i]<<i;

Is korter, directer gerelateerd aan wat je wilt bereiken en heeft geen last van 't probleem dat .oisyn aanstipte.

Voorwaarde is wel dat alle elementen van b uitsluitend 0 of 1 zijn (anders kan je natuurlijk b[i]!=0 gebruiken).

Nu ik er over nadenk, je bit-array kan je ook op die manier maken. (Nu ging dat blijkbaar fout.)
code:
1
2
for (a='X', i=0; i<8; i++)
  b[i] = (a>>i)&1;

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Soultaker:
Commentaar toevoegen aan zulke eenduidige code is echt 't meest onzinnige wat je kan doen.
Begeleidend schrijven != commentaar ;)
never mind

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Dit is de code die ik uit eindelijk gebruik zeg maar ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

void
assemble_bit (char b[8])
{

    int i;
    int a, buf;
    int d = 0;
    for (i = 0; i < 8; i++)
    {
        a = a << 1;
        if (b[i] == '1')
        {
            a = a + 1;
        }

    }
    printf ("%c is gelijk aan %s\n", a, b);

}

void
main ()
{
    assemble_bit ("01000010");
}

Het probleem was .. dat ik if (b[i] == 1) had ipv if (b[i] == '1')

tnx for the help :*

Verwijderd

Euhhhhhhhhhhhhh waik nait heur....maarehhhh luister es ff gila!(ZG-NJ-60...RIP!!)

wanneer los je mijn bsod probleem op??

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op dinsdag 14 mei 2002 14:37 schreef Gila het volgende:
Dit is de code die ik uit eindelijk gebruik zeg maar ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

void
assemble_bit (char b[8])
{

    int i;
    int a, buf;
    int d = 0;
    for (i = 0; i < 8; i++)
    {
        a = a << 1;
        if (b[i] == '1')
        {
            a = a + 1;
        }

    }
    printf ("%c is gelijk aan %s\n", a, b);

}

void
main ()
{
    assemble_bit ("01000010");
}
Wat een onleesbare bloatware... enorme lappen code voor een operatie van niets en ter verduidelijking ga je dan ook nog de variabelen A, D en I noemen.... not to mention dat je A niet op nul initialiseert (BUG!!!) en BUF en D niet gebruikt.

Professionele website nodig?


Verwijderd

Op zaterdag 25 mei 2002 17:48 schreef curry684 het volgende:
Wat een onleesbare bloatware...
offtopic:
Hey curry, check this :Y)
Pagina: 1