AVR gcc - string to hex ?

Mar 31, 2007 6 Replies

Mam tekst w takiej postaci: "54455354" jak zamienić go na taką postać 0x54 0x45 0x53 0x54 ?



Czyli konwersja string na hex. Jest do tego funkcja w avr-libc ?


tomi snipped-for-privacy@gazeta.pl pisze:

Chyba nie. Trzeba samemu nagi±æ. Ja naskroba³em co¶ takiego

unsigned char char2nibble(unsigned char in){ return (in>'9')?in-'a'+0x0a:in-'0'; }

void string2number( unsigned char * tekst, // tekst ASCII unsigned char * zmienna,//adres w pamiêci unsigned char ile){ // ile bajtów ³ykac unsigned char a; for(a=0;a<ile;a++){

*zmienna=(char2nibble(*(tekst++)))<<4; *(zmienna++)|=(char2nibble(*(tekst++))); } }

tomi napisał(a):

Jesli tylko w ten sposob (1:1, czyli znaki ascii na "bcd upakowany") to proste jak budowa cepa. Bierzesz po kolei kazdy bajt/char z stringu, odejmujesz od niego 0x30 (konwersja ascii cyferki '0' - '9' na liczbe 0-9), i wstawiasz do swojej zmienej/zmiennych, ew co 2gi znak przesuwajac ta zmienna <<4 (w lewo o 4 bity).

Jest strtol() w stdlib.h, ale spodziewa³bym siê wiêkszego narzutu kodu ni¿ w twoim rozwi±zaniu ;-)

Patryk Sielski napisał(a):

Dzięki! Jest niby strtol(), ale zajmuje prawie 1k kodu więcej, niż Twoje rozwiązanie ;)

Tiaaa. Bêdzie dzia³a³o dopóki nie natrafisz na tekst typu "ABCDEF". Trzeba do tego dodaæ jeszcze warunek, bo pomiedzy '9' a 'A' jest jeszcze 7 znaków "smieci".

Masz tu mojego gotowego "BinLadena". Pisany do innych zastosowañ, ale w razie potrzeby sobie przerobisz.

unsigned char Hex2BinDigit(char* hex) { unsigned char bin;

bin = (hex[0] <= '9' ? hex[0] - '0' : hex[0] - '0' - 7) * 0x10 ; bin += hex[1] <= '9' ? hex[1] - '0' : hex[1] - '0' - 7 ;

return bin; }

void Hex2Bin(char* hex, char* bin, int binLen) { for (int i = 0, j = 0; i < binLen; i++, j+= 2) bin[i] = Hex2BinDigit(hex + j); }

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required