LINUX.ORG.RU

Преобразовать массив чисел char в hex


0

1

Добрый день!
стоит следующая задача:
char *digits = «3224833640520308023»
как этот массив преобразовать в hex?
в результате должно получиться 2cc0e91c32f15537.
Ограничения: целевая платформа не поддерживает 64 битные числа.


Написать для этого функцию

UVV ★★★★★
()
Ответ на: комментарий от Jetty

Судя по приведенному примеру автор хочет из строкового представления десятичного числа получить строковое представление соответсвующего шестнадцатеричного числа. Чем ему поможет snprintf при условии что десятичное число не вписывается ни в один стандартный тип?

anonymous
()
Ответ на: комментарий от anonymous

да, результат не обязательно строка, массив тоже подойдет.

mguest
() автор топика

Сессия? Язык - Си? Могу сделать, быстро и не дорого. Всего 90 евро, 100% предоплата.

Manhunt ★★★★★
()
Ответ на: комментарий от Jetty

Но это понятно дело что только в случае использования куте вцелом :)

Jetty ★★★★★
()
Ответ на: комментарий от anonymous

[code=c] char* hex = 0; mpz_t x;

mpz_init_set_str(x, «3224833640520308023», 10); hex = mpz_get_str(0, 16, x); [/code]

anonymous
()

Использовать готовую библиотеку для работы с очень большими целыми числами или же реализовать свою «делилку в столбик».

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от mguest

На python это выглядит так hex(long(«3224833640520308023»)) ;-)

А если на С, то как сказали выше или искать либу или ручками... Ручками можно сделать строк за 10, и это будет полезно;-)

число можно хранить как массив char, вычитаем 48 (ASCI код нуля), получаем цифру. Алгоритмов много, что б не писать сложения в столбик я бы перевел все в массив каких нить беззнаковых short или char (т.е. обычное представление числа но порубленное по кусочкам), забил бы туда исходное число учитывая переносы а потом бы каким нить snprintf-ом вывел в буфер.

AIv ★★★★★
()
$ bc
obase=16
3224833640520308023
2CC0E91C32F15537

Я типа не понял, что речь идет о С

sdio ★★★★★
()

использовать дополнительную библиотеку можно, но только ради одной операции не охото попадать в зависимость от неё.

Один из вариантов алгоритма может быть такой:
Результат можно получить в виде двух 32 битных чисел (p1, p2).

в цикле перебираем исходный массив и сдвигаем данные из p2 в p1/
3 - p1=0, p2 = (0x3)
2 - p1=0, p2 = (0x20)
...
3 (последняя цифра)
p1 = 2cc0e91c, p2=32f15537

mguest
() автор топика
Ответ на: комментарий от mguest

Не мучай себя и преподавателя, воспользуйся услугами профессионального программиста.

PS по секрету скажу, что можно запросто переводить из одной системы счисления в другу строки произвольной длины (которые не влезают не только в 64 бита, но и в 10000000000 бит)

Manhunt ★★★★★
()
Ответ на: комментарий от anonymous

>Я тоже знаю твой секрет: libgmp

ОМФГ... 25 лет назад сабжевые вычисления делали на программируемом калькуляторе Б3-34. На его тринадцати 8-разрядных десятичных регистрах считали двадцатиразрядную (десятичную) арифметику...

А уж на простом Бейсике что можно было сотворить... Даже на МК-85...

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

Решение со сторонними либами - анонимусу не нравится.
Решение без сторонних либ - анонимусу опять не нравится.
Анон, с такими требованиями к окружающему миру, у тебя есть только один выход: сделать вдоль :D

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

> Решение со сторонними либами - анонимусу не нравится.

Откуда у вас такая информация?

anonymous
()
Ответ на: комментарий от KRoN73

Давайте теперь на ассемблере будем все писать или еще лучше в машиных кодах сразу, потому что N лет назад так и делали.

anonymous
()
Ответ на: комментарий от anonymous

Давайте будет включать немножко мозг и хоть немного в школе учиться.

Деление в столбик в каком классе проходят? Вот этот алгоритм и работает для деления с произвольной разрядностью.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Вы каждый раз все с нуля пишите? Например, копируя С-строку вы воспользуетесь готовой или будете писать свою функцию копирования?

anonymous
()

Халява

Вот программка, которая переводит аргументы командной строки из десятичного вида в двоичный, и печатает биты в обратном порядке. Счастливого быдлокодинга, студент :D

$ ./a.out 0 1 2 978123
0000
1000
0100
110100110011011101110000
#include <stdio.h>
#include <string.h>
#include <assert.h>

void text_to_bcd(int size, char *text)
{
	int i;
	for(i = 0; i < size; ++i)
	{
		assert(text[i] >= '0' && text[i] <= '9');
		text[i] -= '0';
	}
}

int bcd_div2(int size, char *bcd)
{
	int i, carry = 0;
	for(i = 0; i < size; ++i)
	{
		if(carry) bcd[i] += 10;
		carry = (bcd[i] & 1);
		bcd[i] = (bcd[i] >> 1);
	}
	return carry;
}

void print_bin_from_bcd(int size, char *bcd)
{
	int i;
	for(i = 0; i < size * 4; ++i)
	{
		printf("%x", bcd_div2(size, bcd));
	}
	printf("\n");
}

int main(int argc, char **argv)
{
	int i;
	for(i = 1; i < argc; ++i)
	{
		int size = strlen(argv[i]);
		text_to_bcd(size, argv[i]);
		print_bin_from_bcd(size, argv[i]);
	}
	return 0;
}
Manhunt ★★★★★
()
Ответ на: комментарий от anonymous

> Вы каждый раз все с нуля пишите? Например, копируя С-строку вы воспользуетесь готовой или будете писать свою функцию копирования?

Дебилушка, это ж учебная программа. Когда разбираются с устройством си-строк, написать вручную strcpy - очень полезное упражнение. Когда разбираются с системами счисления и алгоритмами для длинных чисел - использовать GMP - это верх идиотизма.

Manhunt ★★★★★
()

Легко, написать алгоритм преобразования. У меня кажется заняло это..аж три строки кода. Без всяких там спринтфов..и тому подобной фигни(библиотечных функций).

Deleted
()
Ответ на: Халява от Manhunt

Для поисковых индексов: выше реализован «метод сдвига и коррекции».

Manhunt ★★★★★
()
Ответ на: комментарий от anonymous

>Вы каждый раз все с нуля пишите?

Я не думаю, что у человека появилась задача поделить эти числа. Судя по всему, он просто не хочет включать мозг.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

политкорректность + толерантность?

> Судя по всему, он просто не хочет включать мозг.

Это теперь так следует называть ленивых ид№отов, чтоб не банили?

anonymous
()
Ответ на: комментарий от Deleted

>Легко, написать алгоритм преобразования. У меня кажется заняло это..аж три строки кода.

а ты задумался для чисел какого размера это будет работать?

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

Виноват, когда отписался не задумался над поставленной задачей. Я говорил о преобразовании строки в десятичном виде в число. Но полагаю что после данного преобразования, можно сделать простое преобразование в строковой вид, в виде hex (хотя как именно, даже сейчас не задумываюсь)...

Deleted
()
Ответ на: комментарий от dimon555

> а зачем так много ноликов в конце?

От лени, ну и чтобы студенту было чем заняться :)

Manhunt ★★★★★
()
Ответ на: Еще халява;-) от AIv

Вычислительная сложность у него какая? Куб от длины строки?

Manhunt ★★★★★
()
Ответ на: Еще халява;-) от AIv

Ваш вариант вообще не тем занимается :) ТСу не надо было отображать 16-тиричный код каждой буквы, ему все число перевести надо было.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от dimon555

Числа можно любой длины сделать, хоть в миллион разрядов. Главное, грамотно реализовать процедуру «деления в столбик».

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

>Главное, грамотно реализовать процедуру «деления в столбик».
это понятно, просто это будет не в три строчки.

dimon555 ★★★★★
()
Ответ на: Еще халява;-) от AIv

Опять С++ головного мозга?

1) В файле нет ничего из С++.

2) Задача не решена

Кем вы работаете, что не понимаете элементарных вопросов и всюду пытаетесь засунуть С++?

anonymous
()
Ответ на: комментарий от dimon555

Главное, грамотно реализовать процедуру «деления в столбик».

это понятно, просто это будет не в три строчки.

Думаю, максимум страницы три :)

Eddy_Em ☆☆☆☆☆
()

> Ограничения: целевая платформа не поддерживает 64 битные числа.

т.е. число будет помещаться в 64 бита, так?

arsi ★★★★★
()
Ответ на: комментарий от mguest

> да, число всегда будет помещаться в 64 бита

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main() {
        const char *num = "3224833640520308023", *p;
        uint32_t a = 0, b = 0, x, y;

        for (p = num; *p; ++p) {
                b = (uint32_t) ((b << 1) | (a >> 31));
                a = (uint32_t)  (a << 1);
                y = (uint32_t) ((b << 2) | (a >> 30));
                x = (uint32_t)  (a << 2);

                if ((uint32_t) ~a < x)
                        ++b;
                a += x;
                b += y;

                x = (uint32_t) (*p - '0');
                if ((uint32_t) ~a < x)
                        ++b;
                a += x;
        }

        printf("%08lX%08lX\n", (unsigned long) b, (unsigned long) a);

        return 0;
}
arsi ★★★★★
()
Ответ на: комментарий от Eddy_Em

Наш вариант как раз все число в двоичную систему и переводит, гляньте внимательней. Отображение это уже дело вкуса.

Выч сложность куб, но от длины в байтах (если делать на int то от длины/4 байта).

Я это к тому, что не обязательно делить в столбик - можно умножать и складывать. Как в том анекдоте с гайцом;-)

Наихрабрейшему Онанимусу с ЛОР-а:

1) не нравится расширение файла - попробуйте в терминале набрать man mv.

2) предложенный код переводит число в двоичное и выводит потом 16-тиричное представление. ТС вроде как этого и хотел. А Вы с-но чего хотите?

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.