Forum: PC-Programmierung uint8 array zu const char, oder bessere möglichkeit


von Jens (Gast)


Lesenswert?

Hallo,

ich habe eine Funktion, welche einen wert als char einlies, was aber 
eigentlich ein hex-wert ist.

readRad(int *a, const char *str, int rad)

readRad(&y, "0029348593", 16);

diesen Wert habe ich aber nur als uint8 array
{0x00, 0x29, 0x34, 0x85, 0x93}

gibt es eine Einfache möglichkeit den Wert irgendwie direkt zu 
übergeben? Also ohne eine extra konvertierung?

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Jens schrieb:
> Hallo,
>
> ich habe eine Funktion, welche einen wert als char einlies, was aber
> eigentlich ein hex-wert ist.
>
> readRad(int *a, const char *str, int rad)
>
> readRad(&y, "0029348593", 16);
>
> diesen Wert habe ich aber nur als uint8 array
> {0x00, 0x29, 0x34, 0x85, 0x93}
>
> gibt es eine Einfache möglichkeit den Wert irgendwie direkt zu
> übergeben? Also ohne eine extra konvertierung?

"0029348593" ist halt was völlig anderes als {0x00, 0x29, 0x34, 0x85, 
0x93}
Ersteres wäre 0x30, 0x30, 0x32, 0x39, 0x33, 0x34, 0x38, 0x35, 0x39, 
0x33, 0x00 wenn du dir den char-String in einzelne Bytes zerleg 
anschaust.
Du brauchst also was was dir das entsprechend umwandelt oder halt eine 
Funktion der du direkt einen int64_t übergeben kannst und keinen 
Zeichen-String erwartet.

von Jens (Gast)


Lesenswert?

Irgend W. schrieb:
> "0029348593" ist halt was völlig anderes als {0x00, 0x29, 0x34, 0x85,
> 0x93}

Das ist mir bewusst, daher ja auch die frage, wie man so etwas am besten 
umsetzen könnte.
letztendlich wird ein array mit 128 bytes übergeben.

Aber dann muss ich mal weitergucken.
besten dank aber schonmal

von foobar (Gast)


Lesenswert?

Schau dir die readRad-Funktion an und teile sie auf.  Sie wird wohl das 
char-Array auch erstmals nach binär wandeln und dann damit was machen. 
Das "damit was machen" in eine extra Funktion packen, die dann sowohl 
von readRad als auch von dir mit dem uint8-Array aufgerufen wird.

Falls readRad aber nichts anderes als ein selbstgetricktes strol ist ...

von foobar (Gast)


Lesenswert?

ehm strol -> strtol, sorry.

von zitter_ned_aso (Gast)


Lesenswert?

Jens schrieb:
> gibt es eine Einfache möglichkeit den Wert irgendwie direkt zu
> übergeben? Also ohne eine extra konvertierung?

ähm, mit dem Präfix 0x und direkt als Zahl?

1
long long i=0x0029348593;

von Jens (Gast)


Lesenswert?

zitter_ned_aso schrieb:
> ähm, mit dem Präfix 0x und direkt als Zahl?

Jens schrieb:
> letztendlich wird ein array mit 128 bytes übergeben.

Jens schrieb:
> readRad(int *a, const char *str, int rad)
>
> readRad(&y, "0029348593", 16);

von Dirk B. (dirkb2)


Lesenswert?

Wenn du readRad nicht anpassen oder konfigurieren kannst, musst du den 
String erzeugen.
Das geht in einer Schleife und sprintf.

Was macht eigentlich der Parameter rad?

von cppbert (Gast)


Lesenswert?

> "0029348593" ist halt was völlig anderes als {0x00, 0x29, 0x34, 0x85,
> 0x93}

Nicht wenn readRad den String schon als Hex Werte interpretiert

von cppbert (Gast)


Lesenswert?

Jens schrieb:
> Irgend W. schrieb:
>> "0029348593" ist halt was völlig anderes als {0x00, 0x29, 0x34, 0x85,
>> 0x93}
>
> Das ist mir bewusst, daher ja auch die frage, wie man so etwas am besten
> umsetzen könnte.
> letztendlich wird ein array mit 128 bytes übergeben.

Er meinte den Dateninhalt, du wohl eher die Syntax

Zeigt doch mal die implementation von readRad oder beschreibe genauer 
was die macht

Wenn da bis zu 128 Zeichen lange hex Strings rein kommen kannst du das 
nicht anders machen (es gibt keinen einfachen Typ der so viel Daten 
aufnehmen kann)

Hier raten nur alle was deine Lösung sein könnte weil du zu wenig 
beschrieben hast, bissle mehr Infos und dann passend die Antworten auch 
zu deinem Problem

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
> Wenn da bis zu 128 Zeichen lange hex Strings rein kommen kannst du das
> nicht anders machen (es gibt keinen einfachen Typ der so viel Daten
> aufnehmen kann)

Ist natürlich quatsch was ich schreibe, sind ja nur maximal 64 bit

dann kanst wirklich einfach

Long long wert = 0x0029348593

schreiben, musst noch auf die Endianess 
(https://de.m.wikipedia.org/wiki/Byte-Reihenfolge) achten
heiss, deine Zahlen könnte verdreht raus kommen, einfach mit printf %x 
ausgeben und vergleichen

von cppbert (Gast)


Lesenswert?

Dirk B. schrieb:
> Was macht eigentlich der Parameter rad?

Steht bestimmt fuer Radix ==> Basis,Basiszahl

Könnte also auch rad = 10 fuer dezimale Zahlen sein

D.h. macht wohl das gleiche wie: 
https://en.cppreference.com/w/c/string/byte/strtol

von Dirk B. (dirkb2)


Lesenswert?

cppbert schrieb:
> Long long wert = 0x0029348593

Nur das die Originalfunktion int ablegt.
wie die 5 Byte auf 2 oder 4 int aufgeteilt wird, kann man am besten im 
Code  sehen.

Oder TO zeigt, was in y geschrieben wird.

von cppbert (Gast)


Lesenswert?

Dirk B. schrieb:
> cppbert schrieb:
>> Long long wert = 0x0029348593
>
> Nur das die Originalfunktion int ablegt.
> wie die 5 Byte auf 2 oder 4 int aufgeteilt wird, kann man am besten im
> Code  sehen.
>
> Oder TO zeigt, was in y geschrieben wird.

Die frage ist, wie kommt er zu dem Array mit den richtigen Werten - das 
könnte man ja auch "einfach" casten

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
>> Nur das die Originalfunktion int ablegt.

Ich denke seine readRad kann keine 128 Zeichen verarbeiten und er weiss 
das noch nicht, oder es gibt noch eine readRadL Funktion

von cppbert (Gast)


Lesenswert?

Jens schrieb:
> diesen Wert habe ich aber nur als uint8 array
> {0x00, 0x29, 0x34, 0x85, 0x93}

Woher kommt das Array? Datei, Speicher?

von cppbert (Gast)


Lesenswert?

Jag mal dein "0029348593" durch

https://www.scadacore.com/tools/programming-calculators/online-hex-converter/
und sag uns welches der vielen Ausgabeformate das richtige ist

von Dirk B. (dirkb2)


Lesenswert?

cppbert schrieb:
> Ich denke seine readRad kann keine 128 Zeichen verarbeiten und er weiss
> das noch nicht, oder es gibt noch eine readRadL Funktion

Hinter int *a kann ja auch ein Array liegen.
Die Länge wird halt durch str bestimmt.

von cppbert (Gast)


Lesenswert?

Dirk B. schrieb:
> cppbert schrieb:
>> Ich denke seine readRad kann keine 128 Zeichen verarbeiten und er weiss
>> das noch nicht, oder es gibt noch eine readRadL Funktion
>
> Hinter int *a kann ja auch ein Array liegen.
> Die Länge wird halt durch str bestimmt.

Wir sind gespannt

von Jens (Gast)


Lesenswert?

cppbert schrieb:
> Er meinte den Dateninhalt, du wohl eher die Syntax

ich meine auch den Inhalt.
Dieser ist aber identisch wie die Werte von Hex werten.

Also ich habe einen array
uint8_t hex[128] = {0x00, 0x29, 0x34, 0x85, ... 0x93}
Diesen bekomme ich über CAN-Bus gesendet (lese den also eigentlich aus 
dem Speicher aus)
Die Funktion benötigt den wert jetzt aber in
const char hex[256] = "00293485...93";

Das es anders ist, als der Array ist mir bewust. Jedoch benötigt diese 
Funktion den Wert halt in diesem Format.

cppbert schrieb:
> Jag mal dein "0029348593" durch
>
> https://www.scadacore.com/tools/programming-calculators/online-hex-converter/
> und sag uns welches der vielen Ausgabeformate das richtige ist

Da wäre uint32 Big endian das richtige Format. Aber ich möchte den 
anderen weg.


Den Inhalt der Funktion weiß ich nicht, da diese in einer lib enthalten 
ist.

von Dirk B. (dirkb2)


Lesenswert?

Jens schrieb:
> Den Inhalt der Funktion weiß ich nicht, da diese in einer lib enthalten
> ist.

Es muss doch aber eine Beschreibung geben, was die Funktion macht.

Da es um Hexzahlen geht, der Parameter rad den Wert 16 hat, die Basis 
eines Stellenwertsystems auch als Radix bezeichnet wird, erwarte ich 
nicht so komplizierte Sachen von der Funktion.

Evtl. brauchst du die gar nicht, wenn du das Array anders aufbereitest

Ich hätte in der Zwischenzeit eine Testfunktion geschrieben, in der ich 
die Funktion mit ein paar (speziellen) Werten aufrufe und das Ergebnis 
ausgebe.

von cppbert (Gast)


Lesenswert?

Jens schrieb:
> Da wäre uint32 Big endian das richtige Format. Aber ich möchte den
> anderen weg.

Mit der fuehrenden null kann es aber kein 32bit wert sein weil 5 bytes 
nicht in einen 4 byte uint32 passen - oder wie soll das gehen?

Noch dazu ist uns nicht klar wie 128 hex nibbles zeichen = 64 bytes in 
das int* a result passen sollen, oder ist a ein array mit n uint32?

> Den Inhalt der Funktion weiß ich nicht, da diese in einer lib enthalten
> ist.

Wie lautet die Beschreibung, Doku der Funktion? Ist die lib public?

von S. R. (svenska)


Lesenswert?

Jens schrieb:
> Also ich habe einen array
> uint8_t hex[128] = {0x00, 0x29, 0x34, 0x85, ... 0x93}
> Diesen bekomme ich über CAN-Bus gesendet (lese den also eigentlich aus
> dem Speicher aus)
> Die Funktion benötigt den wert jetzt aber in
> const char hex[256] = "00293485...93";

Nenne dein uint8_t-Array hexIn und dein char-Array hexOut (und mache es 
257 Byte groß).

Und dann rufe einfach snprintf auf:
snprintf(hexOut, 257, "%02x%02x...%02x%02x", hex[0], hex[1], ..., 
hex[126], hex[127]);

Nicht unbedingt hübsch, aber funktional. Kann man auch in einer Schleife 
machen, oder mit itoa() sofern vorhanden, etc.

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

Jens schrieb:
> Da wäre uint32 Big endian das richtige Format. Aber ich möchte den
> anderen weg.

Also so wie ich das sehe brauchst du die Funktion garnicht sondern 
kannst deinen puffer (das array) gleich in einen uint32 casten

Was fehlt ist
1. wiso passt dein 5 byte hex string in ein 4byte uint32? Werden 
fuehrende nullen ignoriert
2. Was ist das Ergebnis von readRad wenn du mehr als die 4 bytes in die 
funktion steckst also z.B. deine 128 bytes? Wie passt das?
3. Wie waere es wenn du uns einfach aufschreibst was in deinem CAN bus 
puffer alles so drin steht, oder ob du das auch nicht weisst?
4. Deine Informationstropfen machen es schwer dir einfach zu sagen was 
du machen musst

Die meisten hier haben kein Problem mif CAN, casten und Endianess :)
Nur deine Infos sind sehr lückenhaft

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.