Go Down

Topic: Char Macdresse umwandeln (Read 2729 times) previous topic - next topic

speedy1982

Hallo zusammen,

ich habe folgendes Problem, sitze da schon Stunden dran und komme einfach nicht weiter,

char m_chValue = "0xDE,0xED,0xEF,0xEF,0xBE,0xED";

Das habe ich vorliegen und nun möchte ich aus dem char ein byte[6] erstellen damit ich die Function

Ethernet.begin(bMacAdress, ipServer); aufrufen kann.

Hoffe jemand kann mir helfen, habe das Gefühl sehe das Wald vor lauter Bäume nicht.....

Vielen Dank schon im vorraus.

Grüße
speedy

mkl0815

Code: [Select]
char m_chValue = "0xDE,0xED,0xEF,0xEF,0xBE,0xED";
geht schon mal gar nicht, denn mit char m_chValue deklarierst Du ein einzelnes Zeichen, nicht 11 Zeichen.
Wenn überhaupt, dann sollte das so aussehen:
Code: [Select]
char* m_chValue = "0xDE,0xED,0xEF,0xEF,0xBE,0xED";
Dann ist es ein C-String mit 12 Zeichen (inkl. terminierendem '\0' Byte).
Kannst Du mal den Code posten der Dir diesen Code, bzw. diese Daten liefert?

Oder ist das Ganze nur eine Deklarationsfrage?
Dann schreib einfach
Code: [Select]

byte m_chValue[6] = {0xDE,0xED,0xEF,0xEF,0xBE,0xED};

speedy1982

Hi,

stimmt da habe ich etwas vergessen, also folgendes ist ggb.

Code: [Select]
char m_chValue[32];

Die Variable fülle ich mit 0xDE,0xED,0xEF,0xEF,0xBE,0xED das in einer TXT File steht.

Code: [Select]
mac=0xDE,0xED,0xEF,0xEF,0xBE,0xED

So nun liegt 

Code: [Select]
char m_chValue[32] = "0xDE,0xED,0xEF,0xEF,0xBE,0xED";

vor, die Kommas sind die Trennzeichen, so Teile ich dann das Char in

Code: [Select]
char* chTile = "0xDE";

Um aber jetzt die Function

Code: [Select]
Ethernet.begin(bMacAdress, ipServer);

aufrufen zu können muss ich auch dem char* einen Byte[6] machen.


Hoffe habe es jetzt verständlicher beschrieben.

Grüße
speedy


uwefed

Quote
aufrufen zu können muss ich auch dem char* einen Byte[6] machen.


Das hat mkl0815 ja bereits erklärt: Du definierst ein byte array und keinen String den Du danach umwandeln mußt.

Code: [Select]
byte m_chValue[6] = {0xDE,0xED,0xEF,0xEF,0xBE,0xED};

Grüße Uwe

speedy1982

Hallo Uwe,

wenn das so einfach wäre, ich müsste ja dann beim laden überprüfen um was es sich handelt.

Kann man nicht einfach das char* chBuffer = "0xEF"; in ein Byte umwandeln so das es die Function frist?

Ich weis am einfachsten wäre es gleich als byte zu deklarieren doch geht das nicht ohne weiteres.

Danke nochmals für eure Hilfe.

Grüße
speedy




uwefed

Erklär mal wieso Du umbedingt diesen Weg gehen mußt.
Grüße Uwe

speedy1982

Hallo Uwe,

wenn es einen anderen einfacheren gibt dann bin ich gerne offen?

Glaube echt in denke zu umständlich.

Ich lade und speichere ja alles in Char Strings, hat auch alles wunderbar geklappt
bis ich dann auf das byte Problem gestoßen bin.

Grüße
Stefan

uwefed

Wieso mußt Du alles in Char strings laden und speichern?
Woher bekommst Du die Daten/Werte?
Grüße Uwe

speedy1982

Hallo Uwe,

naja ich habe das so geschrieben, daten kommen aus einer txt datei

Code: [Select]
datei.txt
macadresse=0xDE,0xED,0xEF,0xEF,0xBE,0xED
webserverip=192.0.0.1
usw...


Lese die Zeichenweise ein und stopfe das dann in ein char[32];

Code: [Select]

while (myFile.available()) {   
    szChar = myFile.read();


Das heisst wenn es anders besser geht, bin ich gerne offen für.

Grüße
Stefan


speedy1982

Hallo Uwe,

hier mal ein kleines Demo was mein Problem darstellt.

Code: [Select]
char bBuffer[32] = "0xDE:0xED:0xEF:0xEF:0xBE:0xED";

char delimiter[] = ":";
char *ptr;

byte bTemp[6];

void setup() {               
  Serial.begin(9600);
}

void loop() {
  ptr = strtok(bBuffer, delimiter);

  bTemp[0] = ptr;

  Serial.println(bTemp[0]);

  return;
}


Hier hängt der Wurm,
Code: [Select]
bTemp[0] = ptr;

In  bTemp[0] sollte dann eigentlich 0xDE stehen.

Wenn es eine einfachere Lösung gibt immer her damit bzw. Denkanstoß.

Grüße
Stefan

jurs


Kann man nicht einfach das char* chBuffer = "0xEF"; in ein Byte umwandeln so das es die Function frist?


Ja natürlich "kann" man das in ein Byte umwandeln.
Wenn man es kann.

Einige hier kennen vielleicht schon meine genialistische Funktion "getIntFromString", mit der man positive Integer-Zahlen in Dezimalschreibweise aus Strings herausziehen kann. Diese Funktion kann man leicht auch so umschreiben, dass als HEX-Werte statt als Dezimalwerte angegebene Integerzahlen aus dem String herausgezogen werden. Das ist meine geänderte Funktion zum Herausziehen von HEX-Werten als Zahl aus einem String:

Code: [Select]

int getHexFromString (char *stringWithInt, byte num)
// input: pointer to a char array
// returns an integer number in hex encoding from the string
// num=1, returns 1st number from the string
// num=2, returns 2nd number from the string, and so on
{
 char *tail;
 while (num>0)
 {
   num--;
   // skip non-"hex"digits
   while( *stringWithInt!='0' && *(stringWithInt+1)!='x' && *stringWithInt!=0) stringWithInt++;
   tail=stringWithInt;
   // find digits
   while ((isdigit(*tail)||(*tail>='A'&&*tail<='F'))&&(*tail!=0)) tail++;
   if (num>0) stringWithInt=tail; // new search string is the string after that number
 }  
 return(strtol(stringWithInt, &tail, 0));
}  


Und so kannst Du sie beispielsweise aufrufen:
Code: [Select]

for (int i=1;i<=6;i++)
   Serial.println(getHexFromString(m_chValue,i));


speedy1982

Hallo Jurs,

BINGO, genau das habe ich gesucht :-) Danke hierfür.

Ich verstehe jetzt was Uwe und mkl0815 gemeint hat, die begin Funktion will einen byte[6] Array mit Zahlen von 0-255.

Habe es jetzt hinbekommen.  :)

Vielen Dank euch allen.

Grüße
Stefan


jurs


Hallo Jurs,

BINGO, genau das habe ich gesucht :-) Danke hierfür.


Keine Ursache!
Wobei meine Funktion wie mit Kanonen auf Spatzen schießen ist, wenn Du genau vorgeben kannst, wo und wie die Hex-Werte im String stehen. Meine Funktion ist mehr eine "Such-den-Hex-Wert" Funktion und kann die Werte da herausziehen, egal welches Trennzeichen dazwischensteht, ob ein oder mehrere Trennzeichen verwendet werden, oder ob sogar noch Text dazwischensteht. D.h. meiner Funktion ist es egal ob da steht:
mac=0xDE,0xED,0xEF,0xEF,0xBE,0xED
0xDE,0xED,0xEF,0xEF,0xBE,0xED
0xDE, 0xED, 0xEF, 0xEF, 0xBE, 0xED
0xDE:0xED:0xEF:0xEF:0xBE:0xED
0xDE 0xED,0xEF:0xEF!0xBE?0xED
mac1=0xDE, mac2=0xED, mac3= 0xEF, mac3= 0xEF, mac5=0xBE, mac6=0xED
Die Funktion holt alles raus, was nach Hex-Zahl aussieht.

Wenn der String immer identisch gleich aufgebaut ist, täte es natürlich auch einfacherer Code zum Dekodieren der Zahlenwerte, und sowas kompliziertes wie meine Funktion würde nicht zwingend erforderlich sein.

speedy1982

Hallo Jurs,

ja der string ist immer gleich aufgebaut, also wenn es einfacher geht immer her damit ;o)

Daten sehen so aus
Code: [Select]
char bBuffer[32] = "0xDE:0xED:0xEF:0xEF:0xBE:0xED";

Grüße
Stefan

jurs

#14
Mar 11, 2013, 12:09 am Last Edit: Mar 11, 2013, 12:16 am by jurs Reason: 1

ja der string ist immer gleich aufgebaut, also wenn es einfacher geht immer her damit ;o)


Anbei mal Code, der Dir gleich ein Byte-Array passend ausfüllt.

Code: [Select]

  char bBuffer[32] = "0xDE:0xED:0xEF:0xEF:0xBE:0xED";
  byte mac[6];
  // mac Adresse setzen
  for (int i=0;i<6;i++)
  {
    char *endptr=bBuffer+5*i+3;
    mac[i]=strtol(&bBuffer[5*i], &endptr, 0);
  }

  // und ein wenig Code zum Testen, ob es stimmt
  for (int i=0;i<6;i++)
  {
    Serial.println(mac[i]);
  } 

Go Up