Toon posts:

[C++] String naar byte array conversie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een patroon file te maken, met hexadecimale cijfers erin. Die text-file ziet er als volgt uit :

C++:
1
2
3
4
5
0xBF;0xBF;0xBF;0xBF;0xBF;0xBF;0xBF;0xBF;

0xA0;0xA0;0xA0;0xA0;0xA0;0xA0;0xA0;0xA0;

0x09;0x09;0x09;0x09;0x09;0x09;0x09;0x09;


Nu krijg ik het voor elkaar de waarden in te lezen naar een string. Het geeft dus de waarde 0xBF

Nu wil ik deze waarde converteren naar BYTE array zo dat je de waarde echt kunt gebruiken als hexadecimale getallen. Ik heb zitten kijken naar de verschillende conversie methodes maar kan de juiste niet vinden.

Wie kan me helpen.

Mocht het handiger zijn als de file er als volgt uit ziet :

C++:
1
2
3
BF;BF;BF;BF;BF;BF;BF;BF;BF;BF; 
A0;A0;A0;A0;A0;A0;A0;A0;A0;A0; 
etc



Dan kan dat ook ik maak namelijk zelf de file aan.

Mijn eerste probeersel is:

Eerste de string naar een int converteren en dan van int naar een BYTE array.
Van string naar int kan met atoi deze functie zit in stdlib.h is dit een omweg of een goede oplossing :?

[ Voor 12% gewijzigd door Verwijderd op 04-11-2004 10:06 ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ik denk dat het altijd handig is om zo weinig mogelijk plaats te gebruiken om dingen op te slaan, kwestie van zo weinig mogelijk disk space te verprutsen...
van mij zou zelfs die ; er vantussen mogen... jij weet dat het altijd paren van tekens zijn...

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
int hextoint(char h)
{
  if(h >= '0' && h <= '0'+9)
    return h-'0';
  else if(h >= 'A'  && h <= 'F')
    return 10 + (h - 'A');
}

...
BYTE b = (BYTE)(hextoing(char1)*16 + hextoint(char2)); 
// kweet niet of deze conversie 'zomaar' zal lukken
// maar dit kan altijd wel anders op een mooie manier opgelost worden
...


eventueel kan die int veranderd worden in een __int8

ik kan me echter een les herinneren van VB.NET waar conversie methodes voorhanden zijn natuurlijk, maar daar kon je gewoon "&h" voor de string plakken en deze netjes converteren...

[ Voor 45% gewijzigd door H!GHGuY op 04-11-2004 10:17 ]

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
HIGHGuy de functie werkt dus bedankt.

Verwijderd

HIGHGuY schreef op 04 november 2004 @ 10:14:
C++:
1
2
3
4
5
6
7
int hextoint(char h)
{
  if(h >= '0' && h <= '0'+9)
    return h-'0';
  else if(h >= 'A'  && h <= 'F')
    return 10 + (h - 'A');
}
Een collega gaf me een keer dit algoritme:
C++:
1
2
3
char inttohex (int i) {
  return '0' + i + 7 * (i > 9);
}

Die 7 is er omdat er tussen '9' en 'A' 7 plaatsen zitten. Dit algoritme lijkt me ook wel om te draaien:
C++:
1
2
3
int hextoint (char c) {
  return c - '0' - 7 * (c > '9');
}

:)

[ Voor 16% gewijzigd door Verwijderd op 04-11-2004 12:52 ]


  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 10-05 09:52

LazySod

Scumbag with a mission

Waarom werk je niet met scanf?

C:
1
2
3
int l_Value;

scanf( "%2x", &l_Value);


zou ook moeten werken..

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Volgens mij moet je dan vreselijk oppassen met die impliciete cast bool -> int

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

farlane schreef op 04 november 2004 @ 11:11:
[...]


Volgens mij moet je dan vreselijk oppassen met die impliciete cast bool -> int
een true converteert altijd naar 1
-4- If the destination type is bool, see conv.bool. If the source type is bool, the value false is converted to zero and the value true is converted to one.

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.


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Verwijderd schreef op 04 november 2004 @ 10:59:
[...]


Een collega gaf me een keer dit algoritme:
C++:
1
2
3
char inttohex (int i) {
  return '0' + i + 7 * (i > 9);
}

Die 7 is er omdat er tussen '9' en 'A' 7 plaatsen zitten. Dit algoritme lijkt me ook wel om te draaien:
C++:
1
2
3
int hextoint (char c) {
  return c - '0' - 7 * (c > '9')
}

:)
maar is je code dan wel portable???
ons is altijd aangeleerd dat je er niet mag op rekenen dat de afstand 9 -> A 7 is maar enkel dat letters, cijfers etc op volgorde staan.

en dat van die scanf, dat zal waarsch het equiv zijn van wat ik in VB.NET gebruikte.

ASSUME makes an ASS out of U and ME


Verwijderd

HIGHGuY schreef op 04 november 2004 @ 12:03:
[...]
maar is je code dan wel portable???
ons is altijd aangeleerd dat je er niet mag op rekenen dat de afstand 9 -> A 7 is maar enkel dat letters, cijfers etc op volgorde staan.
Dan gebruik je toch in plaats van 7:
code:
1
'A' - '9'

;)

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Verwijderd schreef op 04 november 2004 @ 12:06:
[...]


Dan gebruik je toch in plaats van 7:
code:
1
'A' - '9'

;)
* H!GHGuY zwijgt en holt naar de deur >:)

ASSUME makes an ASS out of U and ME


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
.oisyn schreef op 04 november 2004 @ 11:49:
[...]
een true converteert altijd naar 1
[...]
In c++ gaat dat idd wel op, maar ik doelde eigenlijk op andere talen waarin dit niet het geval zou zijn.

Is dat trouwens ook het geval in C?

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

Had C99 nou een bool type? C89/90 iig niet, daar returnt een vergelijkingsoperator sowieso een int. Ik geloof dat dat altijd 1 is, maar ik weet het niet zeker... En het interesseert me ook niet, C sucks ;)

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.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Volgens mij is in C de waarde 0 false, en al het andere true. Daar moet je dan wel een beetje mee uitkijken. Veel functies returnen volgens mij ook -1 voor true. Maar ik kan me vergissen.

Verwijderd

.oisyn schreef op 04 november 2004 @ 12:39:
Had C99 nou een bool type? C89/90 iig niet, daar returnt een vergelijkingsoperator sowieso een int. Ik geloof dat dat altijd 1 is, maar ik weet het niet zeker... En het interesseert me ook niet, C sucks ;)
Volgens google: "There was no bool type in C before the C99 standard bla bla..."

Verwijderd

Gebruik de iostreams library, die heeft manipulators voor hexadecimale invoer en uitvoer:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>                                                                                                                                                                                          

int main()
{
        int waarde;
        if(std::cin >> std::hex >> waarde) {
                std::cout << "invoer: " << waarde << '\n';
        } else {
                std::cerr << "foutieve invoer!\n";
        }
        return 0;
}

[ Voor 24% gewijzigd door Verwijderd op 04-11-2004 13:01 . Reden: ik snap niet waarom dit de layout verneukt??? ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
C99 heeft _Bool :(

En 'A'-'9' trucken werken matig als iemand 'a9' gebruikt.
LazySod's scanf( "%2x", int* ) is wel zo veilig.

C:
1
2
3
inttohex(int i) { /* typisch 1 ASM instructie  */
  return "0123456789ABCDEF"[i];
}

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Het probleem van omzetten is gelukt, alleen aan het einde van de regel neemt die de regel omslag mee. Deze code gebruik ik :

code:
1
while (a_file.get(cTeken)&& cTeken != ';')


Hoe kan ik er voor zorgen dat de regel omslag genegeerd wordt?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik snap niet dat je C++ zegt te gebruiken en dan zo moeilijk doet met characters lezen etc. Gebruik gewoon wat mietje zei. En zeg anders gewoon dat je C gebruikt :P

Verwijderd

MSalters schreef op 04 november 2004 @ 12:59:
C:
1
2
3
inttohex(int i) { /* typisch 1 ASM instructie  */
  return "0123456789ABCDEF"[i];
}
En dan maar hopen dat de caller een i meegeeft die netjes in [0,15] ligt :P
Pagina: 1