C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
hex формат
light_baby
Отправлено: 10.12.2005, 13:50


Не зарегистрирован







На входе строка(AnsiString):
04e20504

Нужно распознать как hex число
Пробовала сначала воспользоваться StrToInt(); а потом IntToHex(); но в инт не конвертится потому что присутствуют левые символы(a,b....).
Подскажите какие есть еще варианты
trigger
Отправлено: 10.12.2005, 14:21


Не зарегистрирован







функция перевода AnsiString числа в хексе в целое integer
CODE

int __fastcall TForm_read::_hextoint(AnsiString ch)
{
int sum=0;
for(int i=0;i<ch.Length();i++)
 {
  switch ( ch[ch.Length()-i] )
   {
     case 'A':
     case 'a': sum += 10*pow(16, i); break;
     case 'B':
     case 'b': sum += 11*pow(16, i); break;
     case 'C':
     case 'c': sum += 12*pow(16, i); break;
     case 'D':
     case 'd': sum += 13*pow(16, i); break;
     case 'E':
     case 'e': sum += 14*pow(16, i); break;
     case 'F':
     case 'f': sum += 15*pow(16, i); break;
     default: sum += StrToInt(ch[ch.Length()-i])*pow(16, i); break;
   }
 }
return(sum);
}


и наоборот. берет число integer и делает строку — число в хексе. второй аргумент функции — необходимое кол-во символов всей строки. т.е. впереди дописывает нули.

CODE
AnsiString __fastcall TFbirk::ctoh(int n, int lim)
{
 AnsiString h = "";
 int r=0, nn=n;
 do
 {
   r=nn % 16;
   nn= nn / 16;
   switch (r)
   {
     case 10: h = "A" + h; break;
     case 11: h = "B" + h; break;
     case 12: h = "C" + h; break;
     case 13: h = "D" + h; break;
     case 14: h = "E" + h; break;
     case 15: h = "F" + h; break;
     default: h = IntToStr(r) + h; break;
   }
 }
while (nn > 0);

r = h.Length();
for(int i =0;i<(lim — r);i++)
 h =+ "0"+h;

return(h);
}


незачто )
Grigoriy
Отправлено: 11.12.2005, 01:31


Мастер участка

Группа: Участник
Сообщений: 381



Вот более интересный метод, можете проверить.
Подпрограмма преобразования строки с шестнадцатеричным числом в значение int
CODE

unsigned int hexstrtoint(AnsiString hexstr)
{
unsigned int temp=0,temp1;
hexstr=UpperCase(hexstr);
for (int i=1;i<=hexstr.Length();i++)
{
temp<<=4;
if (hexstr[i]<='9')
temp1=hexstr[i]-'0';
else
temp1=hexstr[i]-'A'+10;
temp+=temp1;};
return temp;
};

и Подпрограмма преобразования значения int в строку с шестнадцатеричным числом
CODE

AnsiString inttohexstr(unsigned int v)
{
unsigned char temp1,i=8;
AnsiString S="00000000";
while (v)
{temp1=v & 15;
if (temp1>9)
S[i]='A'+temp1-10;
else
S[i]='0'+temp1;
v>>=4;
i--;};
return S;
};


Отредактировано Grigoriy — 11/12/2005, 01:34
Георгий
Отправлено: 11.12.2005, 15:42


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



народ я в шоке... а вот так не лучше?
CODE
int hexstrtoint(AnsiString hexstr)
{
hexstr=AnsiString("0x")+hexstr;
return hexstr.ToInt();
};
и преобразование int в hex строку
CODE
AnsiString inttohexstr(unsigned int v)
{
AnsiString S;
S.sprintf("%X", v);
return S;
};

light_baby
StrToInt не работал т.к. HEX строка должна с "0x" начинаться. подпишешь 0x и будет всё работать — см. мою функцию "hexstrtoint" biggrin.gif

Отредактировано Георгий — 11/12/2005, 16:45
Grigoriy
Отправлено: 11.12.2005, 20:06


Мастер участка

Группа: Участник
Сообщений: 381



biggrin.gif
CODE

int hexstrtoint(AnsiString hexstr)
{
return (AnsiString("0x")+hexstr).ToInt();
};

AnsiString inttohexstr(unsigned int v)
{
AnsiString S;
return S.sprintf("%X", v);
};
Gedeon
Отправлено: 12.12.2005, 09:04


Ветеран

Группа: Модератор
Сообщений: 1742



CODE

char *string = "FFF", *endptr;
unsigned long lnumber;
lnumber = strtol(string, &endptr, 16);


Отредактировано Gedeon — 12/12/2005, 09:06
AVC
Отправлено: 12.12.2005, 09:12


Ветеран

Группа: Модератор
Сообщений: 1583



А еще есть IntToHex(int, ширина) -> AnsiString. Сама добавит левые 0.
(За ToInt для строк начинающихся с "0x" спасибо, не знал)
light_baby
Отправлено: 17.12.2005, 16:04


Не зарегистрирован







Спасибо всем biggrin.gif воспользовалась все-таки вариантом hexstrtoint(); а то как-то конвертить промежуточно в char неприкольно, а про первый вариант вобще молчу хоть он и рабочий smile.gif
trigger
Отправлено: 19.12.2005, 11:47


Не зарегистрирован







мдаа.. вот так и помогай людям...
буквально в первые 20 минут дал работающее решение.. а меня еще и обосрали... -)
Георгий
Отправлено: 19.12.2005, 22:11


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (trigger @ 19/12/2005, 12:47)
мдаа.. вот так и помогай людям...
буквально в первые 20 минут дал работающее решение.. а меня еще и обосрали... -)

хорошо пошутил biggrin.gif

Вернуться в Вопросы программирования в C++Builder