Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C-Programming] BYTE string omzetten naar char string

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ben bezig te programmeren in C en heb nu het probleem dat ik een byte string binnen krijg.
Deze moet ik vertalen naar een char string. Normaal gesproken pak je hier ITOA voor.
Helaas zit ik op een embedded platform dus is dat niet mogelijk.

Hoe zouden jullie een 2 byte hex getal omzetten naar een "normaal getal".
Krijg nu als ik 30 30 binnen krijg, 2 spaties in me string. Heeft te maken met je ancii tabel.

Ik wil dus als ik 30 binnen krijg ook 30 kunnen printen in me char dus hoe zet ik dit om?
Heb al het nodige geprobeerd maar het lukt me niet om deze 2 spaties te vervangen door 30.
Zelfs heb ik me eigen ITOA functie te schrijven.

  • Caballeros
  • Registratie: November 2008
  • Niet online
hoe zou je zelf een hexadecimaal getal omzetten in een decimaal getal ?

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Verwijderd schreef op woensdag 18 december 2013 @ 09:37:
Hoe zouden jullie een 2 byte hex getal omzetten naar een "normaal getal".
Krijg nu als ik 30 30 binnen krijg, 2 spaties in me string. Heeft te maken met je ancii tabel.
Het kan aan mij liggen (ben niet goed uitgeslapen), maar zijn 2 spaties niet 20 20?
De laatste keer dat ik de ASCII-tabel checkte had een spatie waarde 32(dec) wat volgens mij toch nog steeds 20(hex) is.
Mijn verontschuldigingen als het komt door mijn "niet-uitgeslapenheid" :O

Zonet bleek een spatie inderdaad nog steeds 32(dec) en 20(hex) te zijn.

Verwijderd

Topicstarter
Correct 20 hex bedoel ik inderdaad! Het is voor mij ook nog vroeg...
Ik wil dus dat 20 hex gewoon 32 dec word inderdaad.
hextodec functie ofzo iets...

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 18 december 2013 @ 10:03:
Ik wil dus dat 20 hex gewoon 32 dec word inderdaad.
20 hex is 32 dec; het is een verschillende representatie van 'tzelfde getal...
Getallen en talstelsels FAQ

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
RobIII schreef op woensdag 18 december 2013 @ 10:17:
[...]

20 hex is 32 dec; het is een verschillende representatie van 'tzelfde getal...
Getallen en talstelsels FAQ
Blijkbaar is het nog vroeg. Krijg nu in me string een spatie geprint en wil een getal geprint hebben.
20 hex is een spatie, daardoor is het te verklaren.
Als ik die 20 hex omzet naar 32 dan print geen spatie maar 32. Dat is wat ik wil.

  • rvisser
  • Registratie: Mei 2010
  • Nu online
Iets als:

C:
1
2
3
4
5
6
7
8
 

unsigned char i = 0x20;
unsigned char a[4];

a[0] = (i % 10) + 0x30;
a[1] = ((i / 10) % 10) + 0x30;
a[2] = (i / 100) + 0x30;


Zet een 8-bit unsigned integer om naar ascii waardes.

Verwijderd

Topicstarter
Zo iets inderdaad maar ik dit doe krijg ik er weer een "," comma uit...
Dus het schiet niet echt op...

  • cenix
  • Registratie: September 2001
  • Laatst online: 12:30
Op deze manier werkt het natuurlijk niet.
1) post eens relevante code met eventuele voorbeelden
2) probeer eens een functie te maken die alleen de conversie van een byte naar een char doet zoals je die verwacht;
3) breidt de functie uit om hetzelfde te doen met een byte-string naar char-string, eventueel door er een functie omheen te leggen

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 18 december 2013 @ 09:37:
Normaal gesproken pak je hier ITOA voor.
Helaas zit ik op een embedded platform dus is dat niet mogelijk.
Hoezo zou dat op een embedded platform niet mogelijk zijn?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned int i = 0x30;
unsigned char a[4] = {NULL};
char test[10] = {NULL};
                    
test[0] = 'R';
test[1] = 'E';
test[2] = '=';

    
a[0] = (i % 10) + 0x30;
a[1] = ((i / 10) % 10) + 0x30;
a[2] = (i / 100) + 0x30;

test[3] = 0x20;
test[4] = '.';
test[5] = a;


Uitput is:
code:
1
RE= .,

Wat ik veracht is:
code:
1
RE=32.48

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22-11 22:46

Creepy

Tactical Espionage Splatterer

Op regel 14 zeg je nu test[3] = 0x20; wat in feite hetzelfde is als test[3] = ' ';

(want even kort door de bocht: 0x20 (32) is de ascii waarde voor de spatie)

Waarom verwacht je daar ineens "32" uit dan? Je print een karakter uit. Dat worden er niet ineens automatisch 2.

Ook doe je "test[5] = a;", wat in feite hetzelfde is als "test[5] = a[0];". test[5] bevat niet ineens a[0], a[1] en a[2].

[ Voor 19% gewijzigd door Creepy op 18-12-2013 12:00 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • cenix
  • Registratie: September 2001
  • Laatst online: 12:30
En je probeert a (een char[4]) in test[5] (een char[1]) te stoppen.

Verwijderd

Topicstarter
hoe kan ik die 0x20 dan omzetten naar 32?
Dat lukt mij dus niet....

Ten 2de klopt het dat het nooit past inderdaad, moet hem dus '&a' van maken zodat ik de inhoud heb van 'a'

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22-11 22:46

Creepy

Tactical Espionage Splatterer

Tweaker12: google eens op "char to ascii" of "int to ascii" (dat had je zelf wel kunnen verzinnen toch?). Dan vind je ladingen met links inclusief kant en klare werkende oplossingen.......

Je lijkt wat basiskennis van C te missen of niet goed te snappen. Kijk je boek/studiemateriaal/whatever er nog eens op na ;) Ook met &a los je je probleem niet op.

[ Voor 31% gewijzigd door Creepy op 18-12-2013 12:07 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 18 december 2013 @ 12:04:
hoe kan ik die 0x20 dan omzetten naar 32?
Dat lukt mij dus niet....
De makkelijkste manier is natuurlijk ITOA, maar het is denk wel goed om inderdaad te begrijpen wat daar gebeurt.

Je hebt 1 getal en die wil je omzetten naar een decimale representatie in characters ( De lengte daarvan kan varieren. In het geval van een enkele byte van 1 tot 3 characters ).

Je wil het in een talstelsel in base 10 doen, dus zul je stap voor stap het getal om moeten zetten naar de waardes '0' t/m '9'

code:
1
2
3
4
5
6
7
8
9
var getal = 0x20;
var base = 10;

while( getal > 0 )
{
    char = ToChar( getal % base );
    print(char);
    getal = getal / base;
}

Voor het omzetten van een getal van 0 t/m 9 naar een char '0' t/m '9' kun je gebruik maken van het feit dat die characters in de ascii table achter elkaar zitten, startend vanaf '0'

code:
1
2
3
4
5
//Werkt alleen met getallen van 0 t/m 9
char ToChar(int getal)
{
    return '0' + getal;
}
Ten 2de klopt het dat het nooit past inderdaad, moet hem dus '&a' van maken zodat ik de inhoud heb van 'a'
Je kunt niet zomaar een array in een array plaatsen, je kunt wel een memcpy of simpel loopje gebruiken.

Kijk ook even naar Programming FAQ - Getallen en talstelsels Dat is belangrijk om goed te begrijpen!

[ Voor 16% gewijzigd door Woy op 18-12-2013 12:17 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Hebbus:
code:
1
2
3
4
5
6
unsigned int i = 0x31;

i &= 0x0F;
i += '0';
if (i > '9')
i += ('A' - '9' - 1);


Output 1 :)

Edit nu alleen een probleem met hoger als 39 oftewel 9.
Hoe word A ook daadwerkelijk 10?

[ Voor 27% gewijzigd door Verwijderd op 18-12-2013 12:39 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 13:12
Woy schreef op woensdag 18 december 2013 @ 11:44:
Hoezo zou dat op een embedded platform niet mogelijk zijn?
itoa is een niet standaard functie, de kans bestaat dat zijn C library die functie niet heeft. Aan de andere kant kan dit ook heel goed met printf wat wel een standaard functie is.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
farlane schreef op woensdag 18 december 2013 @ 14:55:
[...]

itoa is een niet standaard functie, de kans bestaat dat zijn C library die functie niet heeft. Aan de andere kant kan dit ook heel goed met printf wat wel een standaard functie is.
Dat weet ik natuurlijk, maar dat wilde ik graag bevestigd hebben van de TS. Ik heb het idee dat de TS die optie gewoon te snel afgeschreven heeft en de kans groot is dat hij bijvoorbeeld gewoon niet de juiste headers geinclude heeft. Zeker omdat ik eigenlijk nog bijna nooit ben tegen gekomen dat die functie niet in de een of andere vorm bestaat ( Zoals je zelf al aanhaalt is printf een alternatief ).
Verwijderd schreef op woensdag 18 december 2013 @ 12:23:
Edit nu alleen een probleem met hoger als 39 oftewel 9.
Hoe word A ook daadwerkelijk 10?
Lees mijn eerdere reactie nog eens door, en ook de link die ik aanhaal. Je mist gewoon wat basis kennis omtrent talstelsels en de representatie daarvan.

[ Voor 17% gewijzigd door Woy op 18-12-2013 15:10 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1