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 ?
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); }
Have something to add? Share your thoughts — no account required.
Ask the community — no account required