www.mikrocontroller.net

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


Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Phil J. (sunflower_seed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nennst du uns auch eine Programmiersprache?

Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh soory hab ich vergessen es ist C++

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
  char string[] = "1AD7C8";

  int len = strlen( string );
  int i;

  char HexByte[5];

  for( i = 0; i < len; i += 2 ) {
    HexByte[0] = '0';
    HexByte[1] = 'x';
    HexByte[2] = string[i];
    HexByte[3] = string[i+1];
    HexByte[4] = '\0';

    printf( "%s", HexByte );
  }

http://www.mikrocontroller.net/articles/FAQ#Wie_fu...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B. so:
#include <string>
#include <iostream>

int main ()
{
  std::string    einstring( "1AD7C8" );

  for( std::string::size_type i=0; i<einstring.size(); i+=2 )
  {
    std::string hexString( "0x" );
    hexString += einstring.substr( i, 2 );
    std::cout << "hexString = <" << hexString << ">" << std::endl;
  }
}

Autor: Helmut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helmut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, aber die C und C++ version machen was anderes.
char s[] = "1AD7C8";

for (int i=0; i<strlen(s); i+=2) {
  printf("0x%c%c\n",s[i],s[i+1]);
}

irgendwie ist mir der C code sympatischer :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Da hat er recht :-)

std::string s = "1AD7C8";

  for (std::string::size_type i=0; i<s.size(); i+=2) {
    std::cout << "0x" << s.substr( i, 2 ) << std::endl;

    // oder auch
    // std::cout << "0x" << s[i] << s[i+1] << std::endl;
  }

> 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.

Autor: Rene H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
 ptr = malloc(10000); /* just a wild guess */ 

findet. :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na und? 10000 ist doch bestimmt genug!

Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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};

Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry es war Lösungsvorschlag Nummer 1.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
unsigned char HexDigit( char c )
{
  if( c >= '0' && c <= '9' )
    return c - '0';

  if( c >= 'A' && c <= 'F' )
    return c - 'A' + 10;

  if( c >= 'a' && c <= 'f' )
    return c - 'a' + 10;

  return 0;
}

unsigned char HexNumber( char d1, char d2 )
{
  return HexDigit( d1 ) * 16 + HexDigit( d2 );
}

...

  char string[] = "1AD7C8";
  unsigned char result[20];

  int len = strlen( string );

  int i;
  int j;

  j = 0;

  for( i = 0; i < len; i += 2 ) {
    result[j++] = HexNumber( string[i], string[i+1] );
  }

  ...

Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie macht du das, dass das array diese werte erwartet?

Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte mit "übergeben" das übergeben von diesem Array an die Funktion 
gemeint.

Autor: Dibo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Ich möchte C Quellcode erzeugen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, was dir fehlt ist die Erkentnis, dass 0x1A nur eine bestimmte 
Schreibweise für eine Zahl ist.
In
int main()
{
  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
int main()
{
  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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.