Forum: PC-Programmierung Wie splitet man eine Zeichenkette auf?


von Dibo (Gast)


Lesenswert?

Hallo Zusammen,

ich möchte gerne eine Zeichenkette des Typs char mit z.B. folgendem 
Inhalt "1AD7C8" immer paarweise aufspliten also 1A D7 C8 und dann an 
jedes Paar 0x voranstellen, so dass ma dies hier erhält 0x1A,0xD7,0xC8. 
Wie kann man dies erreichen?

MfG
Hans

von Phil J. (sunflower_seed)


Lesenswert?

Nennst du uns auch eine Programmiersprache?

von Dibo (Gast)


Lesenswert?

Oh soory hab ich vergessen es ist C++

von Karl H. (kbuchegg)


Lesenswert?

Dibo schrieb:
> Hallo Zusammen,
>
> ich möchte gerne eine Zeichenkette des Typs char mit z.B. folgendem
> Inhalt "1AD7C8" immer paarweise aufspliten also 1A D7 C8 und dann an
> jedes Paar 0x voranstellen, so dass ma dies hier erhält 0x1A,0xD7,0xC8.
> Wie kann man dies erreichen?

Deine Zeichenkette ist sicherlich nicht vom Typ char, sondern vom Typ 
char[], also ein Array von Charactern.
Du kannst also ganz normale Arrayzugriffe nehmen.
1
  char string[] = "1AD7C8";
2
3
  int len = strlen( string );
4
  int i;
5
6
  char HexByte[5];
7
8
  for( i = 0; i < len; i += 2 ) {
9
    HexByte[0] = '0';
10
    HexByte[1] = 'x';
11
    HexByte[2] = string[i];
12
    HexByte[3] = string[i+1];
13
    HexByte[4] = '\0';
14
15
    printf( "%s", HexByte );
16
  }

http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F

von Karl H. (kbuchegg)


Lesenswert?

> Oh soory hab ich vergessen es ist C++

Wieso nimmst du dann char und nicht std::string?
(Mit std::string kann man genau dasselbe machen, nur benutzt man dann 
nicht strlen sondern die Memberfunktion. Aber Arrayzugriff funktioniert 
genau gleich)

von Klaus W. (mfgkw)


Lesenswert?

z.B. so:
1
#include <string>
2
#include <iostream>
3
4
int main ()
5
{
6
  std::string    einstring( "1AD7C8" );
7
8
  for( std::string::size_type i=0; i<einstring.size(); i+=2 )
9
  {
10
    std::string hexString( "0x" );
11
    hexString += einstring.substr( i, 2 );
12
    std::cout << "hexString = <" << hexString << ">" << std::endl;
13
  }
14
}

von Helmut (Gast)


Lesenswert?

Also ich als Gelegenheits-C-Programmierer finde das erste Beispiel 
wesentlich übersichtlicher. Nur weil das zweite C++ nutzt, ist es noch 
lange nicht besser vertständlich und/oder besser wartbar.

von Klaus W. (mfgkw)


Lesenswert?

Wenn man C kennt und weniger C++, dann ist C++ natürlich kein Geschenk.
Wenn er aber eine C-Version hat und fragt, wie es denn in C++ mit
C++-Mitteln geht (so habe ich die Frage zumindest interpretiert,
wenn es in Richtung std::string gehen soll), dann gebe ich ihm halt C++.
Du magst C lieber? Damit habe ich kein Problem, nimm es doch.
Ich habe nie behauptet, daß meine Lösung irgendiwe schöner, bunter,
geiler oder basisdemokratischer wäre - es ist halt die C++-Art passend
zum C-Beispiel von KHB. Soll jeder nehmen was ihm gefällt, und das
andere in Grund und Boden verdammen.
Und ja, man kann es auch noch in ASM machen.

von Helmut (Gast)


Lesenswert?

@Klaus
Das war kein Vorwurf an dich, sondern eher als allgemeiner Kommentar zum 
Thema C oder C++ zu verstehen. Ich finde C deutlich einfacher als echtes 
C++, wenn man nur selten programmiert.

von Klaus W. (mfgkw)


Lesenswert?

... wenn man nur selten C++ programmiert.
Wenn man beides kann, hat die C++-Variante durchaus Vorteile.

Ich bin ja auch nicht irgendwie pikiert; nur war die Frage halt
konkret nach C++. Wer nicht will, muß es doch nicht so machen.

von zwieblum (Gast)


Lesenswert?

hm, aber die C und C++ version machen was anderes.
1
char s[] = "1AD7C8";
2
3
for (int i=0; i<strlen(s); i+=2) {
4
  printf("0x%c%c\n",s[i],s[i+1]);
5
}

irgendwie ist mir der C code sympatischer :-)

von Karl H. (kbuchegg)


Lesenswert?

zwieblum schrieb:
> hm, aber die C und C++ version machen was anderes.

Da hat er recht :-)
1
std::string s = "1AD7C8";
2
3
  for (std::string::size_type i=0; i<s.size(); i+=2) {
4
    std::cout << "0x" << s.substr( i, 2 ) << std::endl;
5
6
    // oder auch
7
    // std::cout << "0x" << s[i] << s[i+1] << std::endl;
8
  }

> irgendwie ist mir der C code sympatischer :-)

Mir nicht. In der Praxis hat man ja eher selten den Fall, dass man den 
String direkt im Programm vorliegen hat, sondern ihn von irgendwoher 
kriegt. Und dann kann std::string seine Vorteile so richtig ausspielen 
:-) Mit C beginnt dann immer die Zitterpartie: Wie gross dimensionier 
ich denn nun das Array.

von Rene H. (Gast)


Lesenswert?

Ja, das ist dann der Fall, wenn man Tage in einem Programm mit mehreren 
Hunderttausend Zeilen Code nach einem Memory Bug sucht und dann die 
Zeile:
1
 ptr = malloc(10000); /* just a wild guess */

findet. :-)

von Klaus W. (mfgkw)


Lesenswert?

na und? 10000 ist doch bestimmt genug!

von Dibo (Gast)


Lesenswert?

Vielen Dank für die tollen Antworten. Ich habe jetzt Lösungsvorschlag 
Nummer 2 verwendet der funktioniert einwandfrei.
Meine nächst Frage wäre, wie übergebe ich das HexByte an ein Array?
Das Array erwartet folgende Werte unsigned char 
array[]={0x1A,0xD7,0xC8};

von Dibo (Gast)


Lesenswert?

Sorry es war Lösungsvorschlag Nummer 1.

von Karl H. (kbuchegg)


Lesenswert?

Dibo schrieb:
> Vielen Dank für die tollen Antworten. Ich habe jetzt Lösungsvorschlag
> Nummer 2 verwendet der funktioniert einwandfrei.
> Meine nächst Frage wäre, wie übergebe ich das HexByte an ein Array?
> Das Array erwartet folgende Werte unsigned char
> array[]={0x1A,0xD7,0xC8};

Kannst du bitte das nächste mal deine Frage gleich richtig und 
vollständig formulieren.

Du willst in Wirklichkeit gar nicht das, was du in deiner Anfrage 
gefragt hast.

Was du willst ist:
Du bekommst einen String.
Aus dem String sind jeweils 2 Zeichen zu entnehmen, diese Zeichen als 
Hex-Zahl zu interpretieren und in einem Array abzuspeichern.

Wichtig ist der Teil: Als Hex-Zahl zu interpretieren bzw. in eine solche 
umzuformen
1
unsigned char HexDigit( char c )
2
{
3
  if( c >= '0' && c <= '9' )
4
    return c - '0';
5
6
  if( c >= 'A' && c <= 'F' )
7
    return c - 'A' + 10;
8
9
  if( c >= 'a' && c <= 'f' )
10
    return c - 'a' + 10;
11
12
  return 0;
13
}
14
15
unsigned char HexNumber( char d1, char d2 )
16
{
17
  return HexDigit( d1 ) * 16 + HexDigit( d2 );
18
}
19
20
...
21
22
  char string[] = "1AD7C8";
23
  unsigned char result[20];
24
25
  int len = strlen( string );
26
27
  int i;
28
  int j;
29
30
  j = 0;
31
32
  for( i = 0; i < len; i += 2 ) {
33
    result[j++] = HexNumber( string[i], string[i+1] );
34
  }
35
36
  ...

von Dibo (Gast)


Lesenswert?

Danke für die Antwort.
Mein String Array das ich habe ist schon in Hex codiert und ich möchte 
immer paaweise 0x davor schreiben wie es deine Funktion weiter oben 
schon macht und diese dann dem Array übergeben. Muss man bei dem 
übergeben an das Array auch Kommas mitübergeben weil ich muss in Main 
die Eingabe unsigned char array[]={0x1A,0xD7,0xC8}; machen damit dieses 
Codes im PDU Format zu ASCII convertiert werden.

von zwieblum (Gast)


Lesenswert?

wie macht du das, dass das array diese werte erwartet?

von Dibo (Gast)


Lesenswert?

ich habe diese funktion nicht selber geschrieben. in der main ist es so 
beschrieben die werte so zu übergeben damit sie richtig convertiert 
werden.

von Karl H. (kbuchegg)


Lesenswert?

Dibo schrieb:
> Danke für die Antwort.
> Mein String Array das ich habe ist schon in Hex codiert und ich möchte
> immer paaweise 0x davor schreiben wie es deine Funktion weiter oben
> schon macht und diese dann dem Array übergeben. Muss man bei dem
> übergeben an das Array auch Kommas mitübergeben weil ich muss in Main
> die Eingabe unsigned char array[]={0x1A,0xD7,0xC8}; machen damit dieses
> Codes im PDU Format zu ASCII convertiert werden.

Oh Mann.
Kannst du bitte deine Informationen alle auf einmal geben und nicht in 
Scheibchen?

Du willst also C-Quelltext erzeugen, oder was?

von Karl H. (kbuchegg)


Lesenswert?

Dibo schrieb:
> ich habe diese funktion nicht selber geschrieben. in der main ist es so
> beschrieben die werte so zu übergeben damit sie richtig convertiert
> werden.

Ich denke, du solltest erst mal C lernen.
Einem Array kann man nichts 'übergeben'. In ein Array werden Werte 
geschrieben.

von Dibo (Gast)


Lesenswert?

OK sorry wenn ich wenn umständlich ausgedrückt habe, ich möchte die 
Werte 0x1A,0xD7,0xC8 in das Array schreiben so dass das selbe bewirkt 
wird wie ein Aufruf in Main mit unsigned char array[]={0x1A,0xD7,0xC8}; 
Das Array wird dann in einer Funktion convert(array,länge,&speicherort) 
übergeben.

von Dibo (Gast)


Lesenswert?

Ich hatte mit "übergeben" das übergeben von diesem Array an die Funktion 
gemeint.

von Dibo (Gast)


Lesenswert?

PS: Ich möchte C Quellcode erzeugen

von Karl H. (kbuchegg)


Lesenswert?

Ich denke, was dir fehlt ist die Erkentnis, dass 0x1A nur eine bestimmte 
Schreibweise für eine Zahl ist.
In
1
int main()
2
{
3
  unsigned char array[]={0x1A,0xD7,0xC8};

wird im Array nicht "0x1A" gespeichert, sondern eine Zahl in ihrer 
Binärform. Ob man die Zahl 26 als 26 schreibt oder als 0x1A ist Jacke 
wie Hose. Es ist in beiden Fällen dasselbe Bitmuster, welches in beiden 
Fällen dieselbe Zahl repräsentiert. Obiges ist völlig gleichwertig zu
1
int main()
2
{
3
  unsigned char array[]={ 26, 215, 200};

D.h. die Lösung, die aus dem String die Zahlen generiert und im Array 
ablegt, ist schon das was du willst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.