Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.87
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
#1

Шестнадцатеричные числа в массиве unsigned char - C++

24.11.2010, 12:13. Просмотров 4371. Ответов 8
Метки нет (Все метки)

Есть массив unsigned char - заполнен, и знаем длину.
В массиве шестнадцатиричное число вида: 51fa9
Нужно реализовать арифметические операции, аналогичные встроенным для целых в C++, и операции сравнения.

Кто поможет тому большое спасибо=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2010, 12:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шестнадцатеричные числа в массиве unsigned char (C++):

Приведение типов unsigned char[2] to unsigned char [64] - C++
Добрый день! Подскажите пожалуйста, как поступить. Есть простая функция main int main() { SHA1Context sha; uint8_t...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? - C++
Ну собственно сабж... std::fstream fs; fs.write((char*)..) В случае бинарного потока я допустим пишу байты функцией write, как...

Неверная конверсия из char* в unsigned char* - C++
Здравствуйте. Почему-то ловлю ошибку, гласящую о том, что не удалась конверсия из char* в *unsigned char*. Не понимаю, почему она вылазит?...

Совместимость char и unsigned char - C++
Есть некие числа в виде unsigned char. Есть строка в виде массива char (которая потом сбрасывается в файл с помощью fputs). В программе...

Unsigned char * в char * и наоборот - C++
Здравствуйте!помогите перевести unsigned char * в char * и наоборот без использования printf

8
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.11.2010, 12:28 #2
Цитата Сообщение от G1m3rr Посмотреть сообщение
Нужно реализовать арифметические операции, аналогичные встроенным для целых в C++, и операции сравнения.
В чем проблема? Арифметика столбиком, как в школе учили. Операции сравнения вообще тупо поэлементное сравнение со старших разрядов числа, если размеры разные, то вообще все очевидно.
1
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 12:58  [ТС] #3
C++
1
2
3
4
5
6
if(((C[i-1]-'0')+(mas[i-1]-'0')+(B[j]-'0'))>15)
            {
                C[i-2]='1';
                C[i-1]=((C[i-1]-'0')+(mas[i-1]-'0')+(B[j]-'0')-16+'0');
                j--;                
            }
C-результат
mas и B - 2 числ, как в условии заменять f на 15, a на 10 итп, а то сумма получается не та которая должна быть.
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.11.2010, 13:59 #4
G1m3rr, вы храните цифры как символы, что не есть хорошо. хотя бы потому что ('a' - '0') - не равно 10
0
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 14:25  [ТС] #5
А я вам про что и пытаюсь тут рассказать!
Мне надо именно с этим и разобраться...
отчасти уже разобрался, код на 600 строк, реализовал, сложение с переносом, остались проблемы с числами разной длины.
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.11.2010, 14:38 #6
Цитата Сообщение от G1m3rr Посмотреть сообщение
А я вам про что и пытаюсь тут рассказать!
Мне надо именно с этим и разобраться...
отчасти уже разобрался, код на 600 строк, реализовал, сложение с переносом, остались проблемы с числами разной длины.
Это не эффективный подход, отсюда и такой большой код, поэтому либо продолжайте мучиться с символами, либо представьте число как надо. Понадобиться только сделать только две функции для ввода числа и вывода.
Я тут в одной из тем (http://www.cyberforum.ru/cpp-beginne...tml#post877851) писал про сложение длинных чисел различной длины, так вот в среднем одна арифметическая операция занимает 40 строк (быстрое деление больше).

Добавлено через 5 минут
Простите, ссылка на навороченные функции. Вот здесь простейшая реализация сложения http://www.cyberforum.ru/cpp-beginne...tml#post855063
0
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 14:40  [ТС] #7
Спасибо большое позже обязательно посмотрю, сложение допишу в том виде как начал, а остальные функции реализую, как вы посоветовали, хотя это и отход от заданной задачи.
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.11.2010, 14:52 #8
G1m3rr, если такое условие, то можно создавать временные массивы и с ними работать. То есть на псевдокоде это будет выглядеть так:
Код
void addition(char *a, char *b, char *result)
{
     // Предполагается что a, b, result содержат именно символы 

     // Создаются новые массивы, которые будут хранить уже преобразованные исходные
     // Работа будет именно с числами, можно воспользоваться динамическим выделением памяти, если есть смысл
     char tmp_a[MAXLEN];     
     char tmp_b[MAXLEN];
     char tmp_res[MAXLEN];

     // Преобразуете числа
     to_num(a, tmp_a);
     to_num(b, tmp_b);

     // Выполняете сложение
     ....

     // Выполняете обратное преобразование
     to_symbols(tmp_res, result);
}
Как более простой вариант, но неверный по своему подходу.
Делаете функцию которая возвращает правильную цифру по символу и работаете с ней. И функцию обратную.
То есть пишете не так:
Цитата Сообщение от G1m3rr Посмотреть сообщение
if(((C[i-1]-'0')+(mas[i-1]-'0')+(B[j]-'0'))>15)
{
C[i-2]='1';
C[i-1]=((C[i-1]-'0')+(mas[i-1]-'0')+(B[j]-'0')-16+'0');
j--;
}
а примерно следующим образом:

C
1
2
3
4
5
6
7
8
char carry = to_num(C[i-1]) + to_num(C[i-1]) + to_num(B[j]);
if(carry > 15)
{
     C[i-2] = to_sym(1);
     C[i-1] = to_sym(carry - 16);
 
     j--;
}
0
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 19:42  [ТС] #9
Помогите плз с конвертацией из int в unsigned char
Вот как конвертировал из unsigned char в int
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int Hex::convert()
{
    int num=0;
    for(int i=0;i<count;i++)
    {
        int buf=1;
        for(int j=count-i;j>1;j--)
            buf=buf*16;
        if((mas[i]-'0')<10)
            num=num+buf*(mas[i]-'0');
        else if (mas[i]=='a')
            num=num+buf*10;
        else if (mas[i]=='b')
            num=num+buf*11;
        else if (mas[i]=='c')
            num=num+buf*12;
        else if (mas[i]=='d')
            num=num+buf*13;
        else if (mas[i]=='e')
            num=num+buf*14;
        else if (mas[i]=='f')
            num=num+buf*15;
    }
    return num;
}
count - Длина массива
с обратной конвертацией, что-то пока проблемы.
0
24.11.2010, 19:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2010, 19:42
Привет! Вот еще темы с ответами:

const char и unsigned char - C++
Всем привет. Такое дело. Это даже проблемой не назовешь, но суть такая. Мне нужно записать const char в unsigned char через конструктор...

Типы данных - где нужно использовать char, а где unsigned char? - C++
Всем привет! У меня вопрос, искал ответ на него, но безуспешно. Вопрос следующий: есть два типа char и unsigned char. Я понимаю, что в...

unsigned char 0....255?! - C++
Всем привет. Всем известно из разной учебной литературы что unsigned char имеет диапазон значений от 0 до 255. Но почему тогда при этом...

Unsigned char to string - C++
Привет всем. У меня полная непонятица unsigned char c = '1'; std::string ass((char*)c); Unhandled exception at 0x012655D1 in...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru