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"
Отредактировано Георгий — 11/12/2005, 16:45 |
|
Grigoriy |
Отправлено: 11.12.2005, 20:06 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
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 |
|
Не зарегистрирован
|
Спасибо всем воспользовалась все-таки вариантом hexstrtoint(); а то как-то конвертить промежуточно в char неприкольно, а про первый вариант вобще молчу хоть он и рабочий |
|
trigger |
Отправлено: 19.12.2005, 11:47 |
|
Не зарегистрирован
|
мдаа.. вот так и помогай людям...
буквально в первые 20 минут дал работающее решение.. а меня еще и обосрали... -) |
|
Георгий |
Отправлено: 19.12.2005, 22:11 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
QUOTE (trigger @ 19/12/2005, 12:47) | мдаа.. вот так и помогай людям...
буквально в первые 20 минут дал работающее решение.. а меня еще и обосрали... -) |
хорошо пошутил |
|