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

 
Сложение битов
sav2005
Отправлено: 13.04.2005, 11:40


Ученик-кочегар

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



Вопрос наверное очень простой.
Есть строка AnsiString, элементами которой есть четыре шеснадцатиричных числа (23 45 23 f). Как эту строку с элементами (числами) преобразовать в одно число (возможно в десятичное), что бы потом его сложить с подобным числом.
AVC
Отправлено: 13.04.2005, 12:29


Ветеран

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



Что в точности вы имеете ввиду под элементами строки ?
То ли у вас так
AnsiString str; str[1]=0x23; str[2]=0x45; str[3]=0x23; str[4]==0x0F;
то ли так
AnsiString str = "234523f";
или еще как то иначе?

И что значит преобразовать в одно? По какому закону? Их можно сложить, перемножить, сделать xor и т.д.
Konstantine
Отправлено: 13.04.2005, 17:29


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

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



2 AVC скорее всего так "23 45 23 f"

2 sav2005 подробнее структуру строки — представьте эту строку с разными числами (если можно — то сделать чтоб так: "23 45 23 0f")
AVC
Отправлено: 14.04.2005, 08:01


Ветеран

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



2Konstantine
Зачем гадать? Тем более что похоже автору ответ не нужен. smile.gif
** sav2005
Отправлено: 14.04.2005, 09:00


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







Нет, ответ нужен. Я попробую уточнить вопрос. Но вместе с ним еще один, как получить десятичное представления символа char. Типа как позволяет inttohex представить в 0х форме. А также шестнадцатиричное число перевести в десятичное.
А также меня интересует следующее: есть массив символов (байтов), равный 4 батов (например 12 56 98 ас). Мне нужно получить из этого массива целое число int (32 бита) 125698ас.
Заранее спасибо.
olegenty
Отправлено: 14.04.2005, 09:38


Ветеран

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



ну строку в число — проще пареной репы:
CODE

   int i = StrToInt("0x2345230f");

то есть просто к строке нужно дописать "0x" в начало, и быть счастливым.

касаемо же второго вопроса, с массивом — реши методом сведения решения к уже решенной задаче: из массива сформируй строку, а дальше допиши "0x" в начало и вызови StrToInt. проще пареной репы, как видишь.
только про байты ты пример неверно привёл. тычу новом в ошибку:
QUOTE

12 56 98 ас

так вот, там либо все символы, либо все коды символов, и ты это должен помнить. "ac" — это 172, которые тебе надо приобразовать к строке в hex формате, чтобы получилось "ас".
AVC
Отправлено: 14.04.2005, 10:25


Ветеран

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



QUOTE

есть массив символов (байтов), равный 4 батов (например 12 56 98 ас). Мне нужно получить из этого массива целое число int (32 бита) 125698ас.

Можно так
CODE

unsigned char cp[] = {0x12, 0x56, 0x98, 0xac};
int i = (((((cp[0] << 8) | cp[1]) << 8) | cp[2]) << 8) | cp[3];
Boyko
Отправлено: 15.04.2005, 15:40


Станционный диспетчер

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



QUOTE (AVC @ 14/04/2005, 09:25)
QUOTE

есть массив символов (байтов), равный 4 батов (например 12 56 98 ас). Мне нужно получить из этого массива целое число int (32 бита) 125698ас.

Можно так
CODE

unsigned char cp[] = {0x12, 0x56, 0x98, 0xac};
int i = (((((cp[0] << 8) | cp[1]) << 8) | cp[2]) << 8) | cp[3];

А можно и так
CODE

unsigned char cp[] = {0x12, 0x56, 0x98, 0xac};
int i = *((int *) cp); // 0x12 — младший байт
Konstantine
Отправлено: 15.04.2005, 16:27


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

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



2 Boyko там обратный порядок байтов smile.gif и поэтому твой способ не подходит
Boyko
Отправлено: 18.04.2005, 16:29


Станционный диспетчер

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



QUOTE (Konstantine @ 15/04/2005, 15:27)
2 Boyko там обратный порядок байтов smile.gif и поэтому твой способ не подходит

2Konstantine

Я знаю и сам написал что 0х12 — младший байт. Хотел выразить только другую идею...

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